我可以使用ObjectChangeListener监听任何对象上的变化?(Can I use Obj

2019-08-02 23:07发布

我有一个Integer名为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不是用referens调用。 我能做什么?

Answer 1:

该问题的答案是“不-你不能”“JNDI和javax.naming是无关你的问题”

我想你可能混淆了JNDI,Java命名和目录接口的Swing / JavaBeans的监听器框架。 一个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 - e.g. update your table
      Integer i = (Integer) e.getNewValue();
  }
});


文章来源: Can I use ObjectChangeListener to listen for changes on any object?