Frage

hat ein paar verschiedenen Ansätze, um dies versucht, aber ohne Erfolg bisher. Nur gefragt, ob ich etwas fehlt bin. Ich habe eine JSpinner, die Bestandteil eines DateSelector Widget neben einem Kalender ist. Ich versuche, eine Validierungsmethode zu feuern, wenn der Benutzer eines beliebigen Text in dem JSpinner ändert anstelle die Kalendersteuerung oder die JSpinner nach oben und unten Pfeilen.

Hier sind die verschiedenen Ansätze ich versucht habe:

jSpinner1.addKeyListener(kl);

jSpinner1.getEditor().addKeyListener(kl);

((JSpinner.DefaultEditor) jSpinner1.getEditor().getTextField().addKeyListener(kl);

Jeder da draußen irgendwelche Ideen bekam, was ich falsch mache? Dank

UPDATE Apologies, hätte ich sagen sollen, dass ich bereits ein Change zum JSpinnerDateModel hinzugefügt, die an den JSpinner angebracht ist. Wie so:

ChangeListener changeListener = new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            dateChanged();
        }
    };

    jSpinnerDateModel.addChangeListener(changeListener);

    KeyListener keyListener = new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println(e.getKeyChar());
            dateChanged();
        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub

        }

    };
    ((JSpinner.DefaultEditor) jSpinner1.getEditor()).getTextField().addKeyListener(
            keyListener);

Danke

Frank

War es hilfreich?

Lösung

JSpinners Griff KeyEvents selbst, aber sie feuern ChangeEvents an die Außenwelt. Hinzufügen eines Change sollte Ihnen ermöglichen, die Validierung Sie durchführen möchten.

Siehe auch: Detecting Spinner Wertänderungen (Java Tutorials)

Andere Tipps

Wenn Sie zu deaktivieren Tastatur Bearbeitung möchten Sie folgendermaßen vor:

JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
tf.setEditable(false);

für wichtige Ereignisse hören Sie benötigen einen Zuhörer in das Textfeld hinzuzufügen. Dies funktioniert für mich:

((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().addKeyListener(new KeyListener(){

            @Override
            public void keyPressed(KeyEvent e) {                    
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("PRESSED!");                    
            }

            @Override
            public void keyTyped(KeyEvent e) {                    
            }

        });

Dies ist ein Fehlbetrag von Swing, und meiner Meinung nach sollte JSpinner JComboBox folgt bei der Versorgung des folgenden Zugriff auf das darunter liegende Textfeld:

JComboBox.getEditor().getEditorComponent()

Von gehen durch die Quelle von J1.7 Ich fand dich so ziemlich die gleiche Sache acheive kann mit

JSpinner.getEditor().getComponent(0)

Sie können also „Hack“ den Hörer auf die folgende Weise:

JSpinner.getEditor().getComponent(0).addKeyListener(...)

Natürlich hängt dies von der ‚unter der Decke‘ Umsetzung des Swing und funktioniert wie bei J1.7, aber es gibt keine Garantie, das funktioniert für andere Versionen Zukunft oder Vergangenheit.

Genießen.

Bearbeiten

oder wenn der Editor eine Instanz von DefaultEditor ist, können Sie es als solche und Verwendung ‚getTextField ()‘ gegossen. Es wäre praktisch, wenn dies in der Schnittstelle definiert wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top