私はスポーツ選手のグループを管理するプログラムを作ろうとしています。各プレーヤーには列挙型Sportがあり、SportManagerには便利なファクトリメソッドがあります。私がやろうとしているのは、名前のJTextFieldとスポーツを選択するためのコンボボックスがあるダイアログを開くことです。ただし、テキストフィールドが空白のときにユーザーがダイアログを閉じないようにしたいので、テキストフィールドが空白のときにユーザーに通知するためにビープ音が鳴るようにPropertyChangeListenerを作成しました。ただし、ビープ音を鳴らした後にユーザーがテキストに何かを入力した場合、リスナーはトリガーされず、値はすでにJOptionPane.OK_OPTIONであり、キャンセルが唯一の方法であるため、キャンセルを押さずにダイアログを閉じることはできません。 JOptionPane.VALUE_PROPERTYを変更します。だから私は追加しようとしました
message.setValue(JOptionPane.UNITIALIZED_VALUE);
リスナー内。ただし、これは、ユーザーにテキストフィールドに入力する機会を与えずに、ウィンドウをすぐに閉じるだけです。おそらく、登録したばかりのリスナーがトリガーされるためです。ビープ音が2回以上鳴り、ユーザーがフィールドに入力できるようにするにはどうすればよいですか?
参考までに、newPlayerは、アクションを登録するコンポーネントです。
コード:
newPlayer.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Object[] msg = new Object [4];
msg[0] = new JLabel("Name:");
final JTextField nameField = new JTextField();
msg[1]=nameField;
msg[2] = new JLabel("Sport: ");
JComboBox<Sport> major = new JComboBox<Sport>(SportManager.getAllSports());
msg[3]=major;
final JOptionPane message = new JOptionPane();
message.setMessage(msg);
message.setMessageType(JOptionPane.PLAIN_MESSAGE);
message.setOptionType(JOptionPane.OK_CANCEL_OPTION);
final JDialog query = new JDialog(gui,"Create a new player",true);
query.setContentPane(message);
query.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
message.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (query.isVisible()&& (e.getSource() == message)&& (prop.equals(JOptionPane.VALUE_PROPERTY))) {
if(nameField.getText().equals("")&&message.getValue().equals(JOptionPane.OK_OPTION)){
Toolkit.getDefaultToolkit().beep();
message.setValue(JOptionPane.UNINITIALIZED_VALUE);
return;
}
query.dispose();
}
}
});
query.pack();
query.setVisible(true);
if(Integer.parseInt(message.getValue().toString())==JOptionPane.OK_OPTION){
players.add(new Player(nameField.getText(),(Sport)major.getSelectedItem()));
edited=true;
}
gui.show(players);
}
});