フォーム(フォーム)にが含まれている場合、フォームのデフォルトボタンを使用すると問題が発生しますJFormattedTextField
。このようなフィールドがあるフォームで、フォーカスがある(そして変更された)場合は、[OK ]を2回押して、デフォルトのボタンを「押す」必要があります。なぜそれが起こるのか私は知っていると思います-それは最初のEnterがコミット処理で消費されるからです。
また、回避策を作成することもできました。Formatter
有効な編集ごとにコミットするように変更すると、適切な動作が得られますが、これにより、a)フォーマッターを明示的に指定する必要があり、b)「古い」値に戻すことはできません。 (例:Escapeを使用する、またはプログラムで)。
以下のコードは次のことを示しています。上部のフィールドを実行すると、各編集でコミットされ、単一のEnterで機能します(ただし、元に戻すことはできません)。下部のフィールドでは元に戻すことができますが、編集する場合は2つの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
は1回だけ検証されます)と、検証に成功した場合は、デフォルトのボタンをアクティブにする方法(1回押す)はありますか?