我想製作一個程序來管理一組運動員。每個玩家都有一個枚舉運動,而SportManager擁有便捷的工廠方法。我想要做的是打開一個對話框,其中包含名稱的JTextField和組合框以選擇一項運動。但是,我想停止用戶關閉對話框,而文本字段爲空,因此我編寫了一個PropertyChangeListener,以便當文本字段爲空時,它會發出蜂鳴聲以讓用戶知道。但是,如果用戶在發出嘟嘟聲之後在文本中放入了某些內容,它不會觸發監聽器,並且您不能在不按下取消的情況下關閉對話框,因爲該值已經是JOptionPane.OK_OPTION,並且取消是唯一方法改變JOptionPane.VALUE_PROPERTY。所以我試圖在偵聽器中添加如何在不觸發偵聽器的情況下從PropertyChangeListener更改JOptionPane的值?
message.setValue(JOptionPane.UNITIALIZED_VALUE);
。然而,這只是立即關閉窗口而不給用戶一個機會來填寫文本字段,大概是因爲它觸發了我剛剛註冊的聽衆。我該如何做到這一點,以便它不止一次發出嗶嗶聲,並讓用戶有機會填寫該字段?
僅供參考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);
}
});
謝謝,會用NetBeans來試試這個 –