タスクの場合、次の動作でJFormattedTextFieldを作成する必要があります。
- 値が編集され、最後に検証された値と等しくない場合、背景は黄色になる必要があります。
- 値の検証はいつでも行うことができます
- フォーカスが失われた場合は何も起こりません(背景が黄色の場合は黄色のままです...)
- Enterキーが押されたときにアクションを実行する必要があります
これを達成するためのリスナーの正しい組み合わせを見つけることができないようです。を使用してみKeyAdapter
ましInputVerifier
たPropertyChangeListener
が、80%しか機能しない非常に醜いコードになります。
これはどのように行う必要がありますか?
編集:私は小さな例を書きました:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.ParseException;
import javax.swing.AbstractAction;
import javax.swing.InputVerifier;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test extends JPanel {
private JFormattedTextField field;
private JLabel label;
private JButton btn;
public Test() {
super(new BorderLayout());
label = new JLabel("Enter a float value:");
btn = new JButton(new AbstractAction("Print to stdout"){
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(field.getValue());
}
});
field = new JFormattedTextField(new Float(9.81));
field.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent e){
field.setBackground(Color.YELLOW);
}
@Override
public void keyTyped(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ENTER){
try{
field.commitEdit();
field.setBackground(Color.WHITE);
}catch(ParseException e1){
field.setBackground(Color.RED);
}
}
}
});
field.setInputVerifier(new InputVerifier(){
@Override
public boolean verify(JComponent comp) {
try{
field.commitEdit();
field.setBackground(Color.YELLOW);
return true;
}catch(ParseException e){
field.setBackground(Color.RED);
return false;
}
}
});
add(label, BorderLayout.NORTH);
add(field, BorderLayout.CENTER);
add(btn, BorderLayout.SOUTH);
}
public static void main(String[] args) {
JFrame window = new JFrame("InputVerifier test program");
Container cp = window.getContentPane();
cp.add(new Test());
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
}
これは私が望むほとんどすべてを行います。しかし、問題はENTERキーが決してキャッチされないことです。KeyListenerに到達する前に消費されると思いますが、どうすればこれを防ぐことができますか?
これを防ぐことができたとしても、上記のコードが実行することを実行する理由はもっと明確になるはずだと私は感じています。