2 Stimmen

Wie man den vom Benutzer bearbeiteten Wert eines JFormattedTextField erhält, der 3 Mal pro Sekunde von einem Swing-Timer aktualisiert wird?

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();
    }

}

3voto

Hovercraft Full Of Eels Punkte 280443

Was ist, wenn Sie die Bearbeitung des JFormattedTextField beim Fokusverlust durchführen?

 @Override
 public void focusLost(FocusEvent e) {
    try {
       if (field.isEditValid()) {
          field.commitEdit();
       }
    } catch (ParseException e1) {
       e1.printStackTrace();
    }
    field.setBackground(Color.WHITE);
    System.out.println(String.valueOf((Long) field.getValue()));
 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X