Ich habe ein JFormattedTextField
-Element mit einem Integer
-Wert, der aktualisiert wird, wenn es nicht den Fokus hat. Dies geschieht 3 Mal pro Sekunde.
Zur Aktualisierung des Werts verwende ich den Swing Timer.
Ich möchte es dem Benutzer ermöglichen, den Wert zu bearbeiten, aber ich weiß, dass der Wert eines JFormattedTextField
nicht jedes Mal aktualisiert wird, wenn es den Fokus verliert. Daher ist es nicht klug, die Modellattribute im lostFocus-Ereignis zu ändern. Andererseits kann der Wert beim Verlust des Fokus durch das Aktualisierungsmodul geändert werden, was die Situation schwieriger macht.
Es ist klar, dass ich auch den PropertyListener
nicht verwenden kann, da der Wert 3 Mal pro Sekunde aktualisiert wird!
Jetzt frage ich mich, wie ich die Variable an Ort und Stelle aktualisieren kann, um die Funktionen des JFormattedTextField
zu nutzen und den Updater mein JFormattedTextField aktualisieren zu lassen, wenn es nicht den Fokus hat! Ist das möglich oder muss ich stattdessen einen inputDialog
verwenden? Wie?
Beispielsweise ist im folgenden Code, wenn ich den Feldeintrag in der GUI auf 200 ändere und dann auf das JFrame klicke, um den Fokus zu verlieren, der Wert, der in der Konsole ausgegeben wird, nicht 200. Es ist ein zufälliger Wert, der zuvor im Feld war.
public class SwingTimerFormattedTextFieldTester {
public static void main(String... args){
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(0, 0, 300, 200);
final JFormattedTextField field = new JFormattedTextField(new Long(100));
field.setColumns(20);
frame.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
frame.requestFocus();
e.consume();
}
});
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(field);
frame.setVisible(true);
Timer timer = new Timer(330, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(!field.hasFocus()){
field.setValue(ThreadLocalRandom.current().nextLong());
}
}
});
timer.start();
field.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
field.setBackground(Color.CYAN);
}
@Override
public void focusLost(FocusEvent e) {
field.setBackground(Color.WHITE);
System.out.println(String.valueOf((Long)field.getValue()));
}
});
frame.requestFocus();
}
}