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

Igu*_*amu 1 java swing jndi javabeans

我有一个Integer叫x; 如果它改变了,那么我想在GUI中更新我的表.要听"x"我试过了

ChangeEvent y = new javax.swing.event.ChangeEvent(x);
Run Code Online (Sandbox Code Playgroud)

我实施javax.naming.event.ObjectChangeListener:

class HDIManagementView extends FrameView 
         implements ObjectChangeListener, ActionListener, TableModelListener  {
Run Code Online (Sandbox Code Playgroud)

我重写了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);

}`
Run Code Online (Sandbox Code Playgroud)

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

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

oxb*_*kes 8

这个问题的答案是"不 - 你不能""JNDI,javax.naming与你的问题无关"

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

InitialContext ctx = new InitialContext();
ctx.rebind("path/to/x", new Integer(4));
Run Code Online (Sandbox Code Playgroud)

为此,您需要一个JNDI实现.为了倾听变化,你会听EventContext:

InitialContext ctx = new InitialContext();
EventContext ec = (EventContext) ctx.lookup("");
ec.addNamingListener("path/to/x", myListener)
Run Code Online (Sandbox Code Playgroud)

如果您尝试这样做,它将失败,因为您尚未定义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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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();
  }
});
Run Code Online (Sandbox Code Playgroud)