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

Java 我可以使用ObjectChangeListener监听任何对象上的更改吗?,java,swing,jndi,javabeans,Java,Swing,Jndi,Javabeans,我有一个名为x的整数;如果它改变了,那么我想在GUI中更新我的表。听“x”我试过了 ChangeEvent y = new javax.swing.event.ChangeEvent(x); 我实现了javax.naming.event.ObjectChangeListener: class HDIManagementView extends FrameView implements ObjectChangeListener, ActionListener, TableMo

我有一个名为x的
整数
;如果它改变了,那么我想在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不是通过引用调用的。我能做什么?

这个问题的答案是“不-你不能”和“JNDI和
javax。命名与你的问题无关”

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

为了做到这一点,您需要一个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 - e.g. update your table
      Integer i = (Integer) e.getNewValue();
  }
});

这个问题的答案是“不-你不能”“JNDI和
javax。命名与你的问题无关”

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

为了做到这一点,您需要一个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 - e.g. update your table
      Integer i = (Integer) e.getNewValue();
  }
});

我想我也很困惑:)事实上,我不知道你在说什么。我只想看看一个整数是否改变了?所以我写了一些文章。也许我错了看到我更新的答案-你只是想要一个
PropertyChangeListener
我必须使用JNDI来理解整数的变化吗?不-忘记JNDI-这与你的问题无关我的计算机会告诉你一些关于你的代码的事情。上面写着“找不到符号PC”:)您可以修复它。谢谢。我想我也很困惑:)事实上,我不知道你在说什么。我只想看看一个整数是否改变了?所以我写了一些文章。也许我错了看到我更新的答案-你只是想要一个
PropertyChangeListener
我必须使用JNDI来理解整数的变化吗?不-忘记JNDI-这与你的问题无关我的计算机会告诉你一些关于你的代码的事情。上面写着“找不到符号PC”:)您可以修复它。谢谢。我试试看