Проблема с базовым поведением слушателя в Java - PullRequest
0 голосов
/ 11 февраля 2011

Немного стыдно, что я не знаю, как это исправить самостоятельно, видя, что у меня есть небольшой опыт работы с Java, однако до сих пор я никогда не делал ничего, кроме веб-программирования на Java.

Я пытаюсь создать мастер и пытаюсь обобщить создание полей, представленных в окне. Таким образом, у меня нет прямого контроля над самим компонентом JTextField, но есть класс-оболочка, который обрабатывает более мелкие детали. Однако я хотел бы знать, когда значение изменилось, поэтому я добавил метод «addVetoableChangeListener», который позволяет мне зарегистрировать VetoableChangeListener в самом JTextField.

Я проверил, что метод вызывается и что он передает слушателя в JTextField при отладке. Тем не менее, ничего не называется. Никаких исключений не запускается, и моя точка останова внутри метода, который реализует интерфейс VetoableChangeListener, никогда не вызывается.

Есть что-то, чего я не получаю? Должен ли слушатель быть своего рода компонентом, прежде чем он будет работать правильно, или он просто должен реализовать интерфейс? Возможно, я упускаю из виду очевидную ошибку, потому что слишком долго концентрировался на ней, и я надеюсь, что она станет очевидной для одного из вас. Более простая версия того, что я пытаюсь сделать, это:

    public class TomcatConfigPanel extends WizardKeyValuePanel implements VetoableChangeListener {
       protected void initPanel(JPanel mainPanel) {
          addField("port", "8080");

          IWizardField portField = getField("port");
          portField.addVetoableChangeListener(this);
       }

       public void vetoableChange(PropertyChangeEvent evt)
             throws PropertyVetoException {
          // Stuff that would drive you Lovecraft insane if you saw what was written here
       }        
    }

   public class WizardTextField implements IWizardField {
      private JLabel label;
      private JTextField field;

      public WizardTextField() {
         // some initialization stuff ...
      }

      public void addVetoableChangeListener(VetoableChangeListener listener) {
         field.addVetoableChangeListener(listener);
      }
   }

1 Ответ

4 голосов
/ 11 февраля 2011

VetoableChangeListener будет вызываться только в том случае, если в JTextField изменяется свойство с ограничениями .Ограниченным свойством является свойство, метод установки которого выдает PropertyVetoException.Итак, если ваш код никогда не вызывает такой метод установки в JTextField, ваш слушатель никогда не будет вызван.Прочитайте http://download.oracle.com/javase/tutorial/javabeans/properties/constrained.html для получения более подробной информации.

Я не нашел какого-либо ограниченного свойства в JTextField (и во всех его классах) в документе API, поэтому я сомневаюсь, что ваш слушатель мог когда-либо быть вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...