Java中基本侦听器行为的问题

时间:2011-02-11 11:19:03

标签: java swing listener

不知道如何自己解决这个问题有点令人尴尬,看看我对Java有多少经验,但是直到现在我还没有真正做过除了使用Java进行Web编程之外的任何事情。

我正在尝试创建一个向导,并尝试概括窗口中显示的字段的创建。因此,我没有直接控制实际组件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 个答案:

答案 0 :(得分:4)

只有在JTextField上更改约束属性时,才会调用VetoableChangeListener。约束属性是一个属性,其setter方法抛出PropertyVetoException。因此,如果您的代码从未在JTextField上调用任何此类setter方法,则不会调用您的侦听器。请阅读http://download.oracle.com/javase/tutorial/javabeans/properties/constrained.html了解详情。

我在API文档中没有在JTextField(及其所有类hirarchy)中找到任何约束属性,所以我怀疑你的监听器是否可以被调用。