2015-03-31 5 views
-1

У меня есть два похожих 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(); 
        } 
       } 
      }); 
+0

Ваш вопрос по существу является одним из: «Почему мой код работает как ожидалось». Чтобы получить лучший и быстрый ответ, вы захотите создать и опубликовать [минимальную примерную программу или mcve] (http://stackoverflow.com/help/mcve). –

+0

Также обратите внимание, что вы сами можете запустить событие уведомления для SwingPropertyChangeSupport JDialog в своем коде. Например, если кнопка нажата, вы можете вызвать 'firePropertyChange (...)', но если вы это сделаете, убедитесь, что вы все этот метод на том же объекте, который содержит слушателя, иначе ничего не произойдет. –

+0

, поэтому вы хотите, чтобы я начал свой проект с нуля, так что я могу опубликовать лучший вопрос. Я уверен, что проблема не такая большая, и я не могу придумать, как объяснить ее более четко, чем у меня уже есть. Я просто хочу знать, почему один диалог вызывает изменение свойства, когда второго диалога нет. –

ответ

3

Я бы упростил код, чтобы решить проблему.

Вы, похоже, используете тот же прослушиватель для двух разных компонентов, с другим поведением. Я бы предложил разделить слушателя на два (или более) экземпляра.

Просто свяжите слушателя с каждым диалогом, вместо того, чтобы пытаться выяснить внутри него, откуда он пришел. Это облегчит понимание того, что происходит, и легче читать в целом.

Если у вас было несколько свойств для мониторинга, с разными результатами, вы могли бы даже использовать addPropertChangeListener(String propertyName, PropertyChangeListener listener) вместо этого и сделать один прослушиватель для каждого излучателя за каждое свойство.

+0

Я попытался добавить новый PropertyListener только для nameDialog, как показано в моем отредактированном вопросе, однако имяDialog все еще не вызывает событие. Также всегда лучше использовать другой слушатель для разных компонентов, потому что я думал, что разделение одного слушателя на основе источника события выполняет ту же работу. –

+0

К Гнупи, 1+ для достойного ответа на то, что было (для меня) запутанным вопросом. @AndrewBrick: надеюсь, это означает, что ваш вопрос теперь полностью ответил, и вы знаете, как исходить отсюда. Пожалуйста, сообщите нам, если это так или нет. Благодарю. –

+0

@AndrewBrick - Я вижу, что вы поместили новый PropertyListener, но сохранили его содержимое идентичным.Вам не нужно проверять, видно ли диалоговое окно, и вам не нужно проверять источник, в этом случае. Когда вы говорите, что это не инициирует событие, вы имеете в виду, что никогда не вводите метод propertyChange при отладке или не получаете действия, которые вы закодировали в нем? – Gnoupi