Почему я должен нажать Enter ДВАЖДЫ для этого JFormattedTextField, чтобы активировать кнопку JDialog по умолчанию? - PullRequest
1 голос
/ 16 сентября 2010

В приведенном ниже примере кода, если пользователь изменяет содержимое JFormattedTextField, а затем нажимает Enter, диалог должен действовать так, как будто нажата кнопка OK. Но для этого требуется два нажатия Enter.

Простой ванильный JTextField всегда действует так, как я и ожидал: изменение текста и нажатие клавиши Enter сразу же активируют кнопку OK.

Это в Mac OS X 10.6 с текущим обновлением Mac Java 1.6.0_20.

Это обходной путь? Это специфическая проблема Mac?

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.text.NumberFormat;
import java.text.ParseException;

public class ScratchSpace {


    public static void main(final String[] args) throws ParseException {
        final JDialog dialog = new JDialog((Frame) null, "Test", true);
        dialog.setLayout(new FlowLayout());

        dialog.add(new JLabel("text field: "));
        dialog.add(new JTextField(20));

        dialog.add(new JLabel("formatted text field: "));
        final JFormattedTextField formattedTextField = new JFormattedTextField(NumberFormat.getIntegerInstance());
        formattedTextField.setValue(42);
        formattedTextField.setColumns(20);
        dialog.add(formattedTextField);

        final JButton okButton = new JButton(new AbstractAction("OK") {
            public void actionPerformed(ActionEvent e) {
                dialog.dispose();
            }
        });

        dialog.add(okButton);
        dialog.getRootPane().setDefaultButton(okButton);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
    }

}

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Добавление этого кода решило проблему,

formattedTextField.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        dialog.dispose();
    }
});
0 голосов
/ 12 ноября 2012

Это не решило мою проблему. Однако мне показалось, что решение проблемы было намного проще:

        private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {
   add(jTextField1);          //this reacts after the "ENTER" gets pressed
   jButton1.doClick();        //this activates the button
   jTextField1.setText("");   //this removes the text from a text-field
  jTextField1.grabFocus();    //this sets a cursor within a text-field
    }
...