У меня есть два похожих JDialogs в моем апплете, оба действуют на ввод, указанный в текстовых полях, и имеют кнопки Enter и Cancel. Я добавил слушателя свойств для обоих обоих диалогов, однако только один из диалогов запускает приемник свойств, а не второй. Есть ли какое-то ограничение на использование PropertyListeners, над которым я злоупотребляю и не подозреваю. Я представил свой код для метода propertyChange() ниже. addQuestionDialog работает отлично, но имяDialog просто не вызывает событие propertyChange, так как ни один из операторов печати, которые я добавил, не появился в моей консоли. Сначала я подумал, что, возможно, условие (JOptionPane.VALUE_PROPERTY.equals (prop) || JOptionPane.INPUT_VALUE_PROPERTY.equals (prop)) никогда не было истинным, но исключение из блока «if» не имело значения. Во-вторых, я подумал, что, возможно, я просто не добавил слушателя Property для nameDialog, но я проверил, и он определенно был добавлен. Я не знаю, что еще может вызвать проблему, поскольку addQuestionDialog почти похож и работает отлично.JDialog не запускает PropertyChangeListener
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (addQuestionDialog.isVisible() && (e.getSource() == addQuestionPane) && (JOptionPane.VALUE_PROPERTY.equals(prop) || JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) {
Object value = addQuestionPane.getValue();
if (value == JOptionPane.UNINITIALIZED_VALUE) {
//ignore reset
return;
}
//Reset the JOptionPane's value.
//If you don't do this, then if the user
//presses the same button next time, no
//property change event will be fired.
addQuestionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
if (value.equals("Enter")) {
String questionTypedText = questionTextField.getText();
String mqlYesTypedText = mqlYesTextField.getText();
String mqlNoTypedText = mqlNoTextField.getText();
sqlModel.addQuestion(questionTypedText, mqlYesTypedText, mqlNoTypedText);
questionTextField.setText("");
mqlYesTextField.setText("");
mqlNoTextField.setText("");
} else { //user closed dialog or clicked cancel
addQuestionDialog.setVisible(false);
}
}
else if (nameDialog.isVisible() && (e.getSource() == namePane) && (JOptionPane.VALUE_PROPERTY.equals(prop) || JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) {
Object value = namePane.getValue();
System.out.println("Entered name dialog box");
if (value == JOptionPane.UNINITIALIZED_VALUE) {
//ignore reset
return;
}
//reset value
namePane.setValue(JOptionPane.UNINITIALIZED_VALUE);
if (value.equals("Enter")) {
System.out.println("gonna add new celeb from input");
sqlModel.addCelebrity(alreadyAskedQuestions, columnValues, nameTextField.getText());
}
//else, user clicked cancel, in either case, close the Dialog box
nameDialog.setVisible(false);
initGUI();
}
}
EDIT: Я пытался добавить отдельный PropertyListener для nameDialog, но nameDialog еще не вызывает событие.
nameDialog.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (nameDialog.isVisible() && (e.getSource() == namePane) && (JOptionPane.VALUE_PROPERTY.equals(prop) || JOptionPane.INPUT_VALUE_PROPERTY.equals(prop))) {
Object value = namePane.getValue();
System.out.println("Entered name dialog box");
if (value == JOptionPane.UNINITIALIZED_VALUE) {
//ignore reset
return;
}
//reset value
namePane.setValue(JOptionPane.UNINITIALIZED_VALUE);
if (value.equals("Enter")) {
System.out.println("gonna add new celeb from input");
sqlModel.addCelebrity(alreadyAskedQuestions, columnValues, nameTextField.getText());
}
//else, user clicked cancel, in either case, close the Dialog box
nameDialog.setVisible(false);
initGUI();
}
}
});
Ваш вопрос по существу является одним из: «Почему мой код работает как ожидалось». Чтобы получить лучший и быстрый ответ, вы захотите создать и опубликовать [минимальную примерную программу или mcve] (http://stackoverflow.com/help/mcve). –
Также обратите внимание, что вы сами можете запустить событие уведомления для SwingPropertyChangeSupport JDialog в своем коде. Например, если кнопка нажата, вы можете вызвать 'firePropertyChange (...)', но если вы это сделаете, убедитесь, что вы все этот метод на том же объекте, который содержит слушателя, иначе ничего не произойдет. –
, поэтому вы хотите, чтобы я начал свой проект с нуля, так что я могу опубликовать лучший вопрос. Я уверен, что проблема не такая большая, и я не могу придумать, как объяснить ее более четко, чем у меня уже есть. Я просто хочу знать, почему один диалог вызывает изменение свойства, когда второго диалога нет. –