Frage

Erstens, um meine Arbeit machen zu erklären ein bisschen einfacher, hier einige meines Code:

JSpinner spin = new JSpinner();
JFormattedTextField text = getTextField(spin);

text.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
            // Do stuff...
    }
});

...

private JFormattedTextField getTextField(JSpinner spinner) {
    JComponent editor = spinner.getEditor();

    if (editor instanceof JSpinner.DefaultEditor) {
        return ((JSpinner.DefaultEditor )editor).getTextField();
    } else {
        System.err.println( "Unexpected editor type: "
                           + spinner.getEditor().getClass()
                           + " isn't a descendant of DefaultEditor" );
        return null;
    }
}

So wie Sie sehen können, habe ich so weit. Und in der Tat, wenn ich in einem Wert in das Textfeld Komponente des Spinners (JFormattedTextField) ein, und drücken Sie die Eingabetaste, es funktioniert.

Was will ich jetzt in der Lage sein das Textfeld reagieren müssen ENTER, ohne manuell auf einen neuen Wert eingeben (die sorta Niederlagen der Zweck eines Spinners aus ihm heraus). Wie kann ich das tun?

War es hilfreich?

Lösung

Ich weiß, das ist nicht die Aktion Hörer ... aber vielleicht kann dies für Sie arbeiten?


    text.addKeyListener( new KeyAdapter() {
            @Override
            public void keyReleased( final KeyEvent e ) {
                if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
                    System.out.println( "enter pressed" );
                }
            }
        } );

Andere Tipps

Ich lief in ein Problem im Zusammenhang mit diesem, mich. In meinem Fall hatte ich eine JSpinner mit einem SpinnerNumberModel Setup so konnte ich Eingabe numerische ID-Werte, und sie dann von einer entfernten Datenbank abgerufen werden. Das funktionierte gut und schön mit einem JButton als meine Auslöser für die Abfrage, aber ich wollte in der Lage sein, den Fokus auf das Feld über Tab zu wechseln, und drücken Sie die Eingabetaste, und auch den Wert ändern kann, indem eine ID mit numerischen Tasten eingeben , dann drücken Sie die Eingabetaste.

Die eine, die mir die meisten Probleme gab wurde manuell die ID mit Zifferntasten eingeben, dann drücken Sie die Eingabetaste. Wenn ich dies tun würde, würde die Abfrage immer noch passieren, aber es war eher die vorherige ID Abfrage als die gerade eingegebenen ich, so würde ich wieder treffen müssen Sie die neue ID abfragen (siehe Code)

((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            queryData();
        }
    }
});

und die Abfrage-Methode:

private void queryData() {
    int minVal = Integer.parseInt(minRng.getValue().toString());
    queryDataBase(minVal);
}

Um dies zu beheben, alles, was ich tun musste, war die Abfrage zu zwingen, laufen zu warten, bis der Spinner seinen Wert aktualisiert, die leicht mit SwingUtilities.invokeLater() getan wurde es bis zum Ende der EDT Warteschlange zu zwingen, etwa so:

((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    queryData();
                }
            });
        }
    }
});

Durch die invokeLater() jetzt die Abfrage auf den neuen Wert geschieht eher als die vorherigen, wenn Sie die Taste Eingabe, da der JSpinner dann seinen Wert auf den neu eingegebenen eine aktualisiert hat.

ich den Grund dafür geh mal davon aus, dass der Wert nicht offiziell an den JSpinner angewandt eingegeben wird, bis Sie die Eingabetaste drücken, die auch den Schlüssel Zuhörer für die Abfrage ausgelöst. Die KeyEvent für die benutzerdefinierten [Abfrage] drücken Hörer erscheinen die erste in der Schlange zu sein, so läuft es seinen Code zuerst, und dann die KeyEvent für den Wert auf die JSpinner aus dem internen JFormattedTextField Anwendung, weshalb es die alten abfragt Wert. SwingUtilities.invokeLater() legt einfach die Abfrage selbst am Ende der Warteschlange, so dass es ermöglicht, die anderen KeyEvent seinen Code zu beenden, bevor die Abfrage ausgeführt wird.

Edit:

Ein andere Möglichkeit, dies zu erreichen ist es, den Wert direkt aus dem JFormattedTextField statt der JSpinner zu beantragen, da dies auch den neu eingegebenen Wert zurück, da bei der JFormattedTextField den Wert enthält, den Sie in getippt, aber es noch nicht überschritten wurde, um die JSpinner, die, wo das Problem zu sein scheint, liegt.

private void queryData() {
    JFormattedTextField tf = ((JSpinner.DefaultEditor) minRng.getEditor()).getTextField();
    int minVal = Integer.parseInt(tf.getText());
    queryDataBase(minVal);
}

Das einzige Problem mit dieser Methode ist, dass Sie dann alle NumberFormatExceptions fangen müssen, wenn das Parsen des Wertes, wobei der SwingUtilities.invokeLater() Ansatz der Spinner Modell ungültige Zeichen zu entfernen erlaubt, automatisch, und fahren Sie mit der Abfrage.

Wie auch immer, ich bin immer noch ein wenig unerfahren mit Java, so dass, wenn mein Verständnis für diese falsch ist, lassen Sie es mich in den Kommentaren wissen.

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