我正在尝试制作一个程序来管理一组体育运动员.每个球员都有一个枚举Sport,SportManager具有便捷的工厂方法.我想做的是打开一个对话框,该对话框具有一个名称的JTextField和一个选择运动的组合框.但是,我想阻止用户在文本字段为空白时关闭对话框,因此我编写了一个PropertyChangeListener,以便在文本字段为空白时会发出哔哔声以告知用户.但是,如果用户在发出哔声后在文本中添加了某些内容,则它不会触发侦听器,并且您不能在不按Cancel的情况下关闭对话框,因为该值已经是JOptionPane.OK_OPTION,而cancel是唯一的方法更改JOptionPane.VALUE_PROPERTY.所以我尝试添加
message.setValue(JOptionPane.UNITIALIZED_VALUE);
在听众内.但是,这只是立即关闭了窗口,而没有给用户提供填充文本字段的机会,大概是因为它触发了我刚刚注册的侦听器.我如何使它发出不止一次的哔哔声并为用户提供填写该字段的机会?
FYI 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);
}
});
解决方法:
我认为您无法使用JOptionPane做到这一点,但可以使用TaskDialog框架和其他一些工具.
您也可以自己创建一个对话框,将更改侦听器附加到您的字段,然后根据字段的内容启用/禁用“确定”按钮.此过程通常称为“表单验证”