Я сталкиваюсь с проблемой, используя кнопку формы по умолчанию, когда она (форма) включает JFormattedTextField
.Если в форме с таким полем есть фокус (и он был изменен), необходимо нажать кнопку OK дважды , чтобы нажать кнопку по умолчанию.Я думаю, я знаю, почему это происходит - это потому, что первый Enter используется при обработке коммитов.
Я также смог сделать обходной путь - если вы измените Formatter
для фиксации при каждом действительном редактировании, то вы получите правильное поведение, но это а) заставит вас указать эксплицит форматеров, и б) этоневозможно вернуться к «старому» значению (например, с помощью Escape или программно).
Код ниже демонстрирует, что: когда вы запускаете его, поле вверху фиксирует каждое редактирование и работает с одним Enter (но вы не можете отменить), поле внизу допускает возврат, но требует two Входит, если отредактировано.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.DateFormatter;
public class ExFrame extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ExFrame frame = new ExFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ExFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JFormattedTextField ff_1, ff_2;
//ff_1 has modified behavior of commit on each (valid) edit
DateFormatter f=new DateFormatter();
f.setCommitsOnValidEdit(true);
ff_1 = new JFormattedTextField(f);
ff_1.setValue(new Date());
//ff_2 has default behavior
ff_2 = new JFormattedTextField(new Date());
contentPane.add(ff_1, BorderLayout.NORTH);
contentPane.add(ff_2, BorderLayout.SOUTH);
JButton btnDefault = new JButton("I am default button");
contentPane.add(btnDefault, BorderLayout.CENTER);
getRootPane().setDefaultButton(btnDefault);
}
}
Так что вопрос: есть ли способ получить JFormattedTextField
оба коммит при Enter (так что ввод проверен проверен, нотолько один раз) и, если успешно подтверждено , активировать кнопку по умолчанию (одним нажатием)?