Erste ENTER mit einem JSpinner, wie es funktioniert mit einem JTextField zu arbeiten
-
22-08-2019 - |
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?
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 NumberFormatException
s 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.