当它(表单)包含JFormattedTextField
. 在具有此类字段的表单上,如果它恰好具有焦点(并且已更改),则必须按两次确定才能“按下”默认按钮。我想我知道它为什么会发生 - 这是因为第一个 Enter 在 Commit 处理中被消耗掉了。
我还能够提出一种解决方法 - 如果您更改Formatter
为在每次有效编辑时提交,那么您将获得正确的行为,但这 a) 会强制您指定格式化程序,并且 b) 无法恢复为“旧”值(例如,使用 Escape 或以编程方式)。
下面的代码演示了:当您在每次编辑时运行顶部提交的字段并使用单个 Enter(但您无法还原)时,底部的字段允许还原,但如果编辑则需要两个Enter。
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);
}
}
所以问题是:有没有办法在 Enter 上JFormattedTextField
同时提交(所以输入被验证但只验证一次),如果成功验证,激活默认按钮(只需按一下)?