我可以使用ObjectChangeListener来监听任何对象的更改吗?

我有一个名为x的Integer ; 如果它改变了,那么我想在GUI中更新我的表。 要听“x”我试过了

 ChangeEvent y = new javax.swing.event.ChangeEvent(x); 

我实现了javax.naming.event.ObjectChangeListener

 class HDIManagementView extends FrameView implements ObjectChangeListener, ActionListener, TableModelListener { 

并重写objectChanged方法来更新我的表。 没啥事儿

 public void objectChanged(javax.naming.event.NamingEvent name){ //gets which status Object y=name.getChangeInfo(); String m=y.toString(); tableModel.setValueAt(y, 0, 0); }` 

如果我改变“x”,那么我的表中没有任何变化。 我做错了什么?

第二个问题是,x只能通过值调用。 我只能从我的数据库或我的属性文件中获取x。 当数据库发生更改时,x无法理解它是否发生更改即使侦听器侦听也是如此。 我所做的只是听y等于x。 当x改变时y不理解,因为x不是由referens调用。 我能做什么?

这个问题的答案是“不 – 你不能”“JNDI和javax.naming与你的问题无关”

我认为您可能会将Swing / JavaBeans侦听器框架与JNDI (Java命名和目录接口)混淆。 ObjectChangeListener仅用于侦听在JNDI上下文中绑定和重新绑定的对象。 您不能使用ObjectChangeListener来侦听任意对象的更改

 InitialContext ctx = new InitialContext(); ctx.rebind("path/to/x", new Integer(4)); 

为此,您需要一个JNDI实现。 为了监听更改,您需要监听EventContext

 InitialContext ctx = new InitialContext(); EventContext ec = (EventContext) ctx.lookup(""); ec.addNamingListener("path/to/x", myListener) 

如果您尝试这样做,它将失败,因为您尚未定义JNDI提供程序 。 通常,这些将由应用程序服务器供应商提供,例如IBM WebSphere或JBoss。 应用程序服务器为应用程序提供JNDI,以查找数据源或配置信息等资源。

为了让你做你真正想要的事情 ,你需要实现一些包装你的整数并使用Java中的属性更改机制的类:

 public class MyInteger { private int x; private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); public void setX(int i) { int old = x; x = i; pcs.firePropertyChange("x", old, x); } public void addListener(PropertyChangeListener l) { pcs.addListener("x", l); } } 

然后,您的代码可以使用它:

 MyInteger i = new MyInteger(9); i.addListener(new PropertyChangeListener() { public void propertyChanged(PropertyChangedEvent e) { //implement to process the change - eg update your table Integer i = (Integer) e.getNewValue(); } });