我正在尝试制作一个程序来管理一组体育运动员。每个玩家都有一个枚举 Sport,SportManager 有方便的工厂方法。我想要做的是打开一个对话框,其中有一个 JTextField 作为名称和一个组合框来选择一项运动。但是,我想阻止用户在文本字段为空白时关闭对话框,所以我编写了一个 PropertyChangeListener 以便当文本字段为空白时,它会发出哔哔声让用户知道。但是,如果用户在关闭哔声后在文本中输入内容,它不会触发侦听器,并且您无法在不按取消的情况下关闭对话框,因为该值已经是 JOptionPane.OK_OPTION,并且取消是唯一的方法更改 JOptionPane.VALUE_PROPERTY。所以我尝试添加
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);
}
});