不知道如何自己解决这个问题有点令人尴尬,看看我对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);
}
}
答案 0 :(得分:4)
只有在JTextField上更改约束属性时,才会调用VetoableChangeListener。约束属性是一个属性,其setter方法抛出PropertyVetoException
。因此,如果您的代码从未在JTextField上调用任何此类setter方法,则不会调用您的侦听器。请阅读http://download.oracle.com/javase/tutorial/javabeans/properties/constrained.html了解详情。
我在API文档中没有在JTextField(及其所有类hirarchy)中找到任何约束属性,所以我怀疑你的监听器是否可以被调用。