1

我有一个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 没有被引用调用。我能做些什么?

4

1 回答 1

8

问题的答案是“不 - 你不能”“JNDIjavax.naming与你的问题无关”

我认为您可能将 Swing/JavaBeans 侦听器框架与JNDI(Java 命名和目录接口)混淆了。AnObjectChangeListener仅对侦听在 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();
  }
});
于 2009-08-28T12:27:49.690 回答