Я пытаюсь составить программу для управления группой спортивных игроков.У каждого игрока есть enum Sport, а в SportManager есть удобные заводские методы.Я пытаюсь открыть диалоговое окно с JTextField для имени и комбинированным полем для выбора вида спорта.Однако я хочу, чтобы пользователь не закрывал диалоговое окно, пока текстовое поле пустое, поэтому я написал PropertyChangeListener, чтобы, когда текстовое поле было пустым, прозвучал звуковой сигнал, сообщающий пользователю.Однако, если пользователь вставляет что-то в текст после отключения звукового сигнала, это не вызывает слушателя, и вы не можете закрыть диалог, не нажимая кнопку отмены, поскольку значение уже JOptionPane.OK_OPTION, и отмена - единственный способизменить 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);
}
});