【问题标题】:Can I use ObjectChangeListener to listen for changes on any object?我可以使用 ObjectChangeListener 来监听任何对象的变化吗?
【发布时间】:2009-08-28 12:24:32
【问题描述】:

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

【问题讨论】:

    标签: java swing jndi javabeans


    【解决方案1】:

    问题的答案是“不 - 你不能”“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 中的 property-change 机制:

    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();
      }
    });
    

    【讨论】:

    • 我想我也很困惑 :) 实际上,我不知道你在说什么。我只想看看一个整数是否改变了?所以我写了一些文章和j2ee.me/j2se/1.3/docs/api/javax/swing/event/ChangeEvent.html。也许我走错路了
    • 查看我的更新答案 - 你只想要一个 PropertyChangeListener
    • 我必须使用 JNDI 来了解整数何时发生变化吗?
    • 不 - 忘记 JNDI - 它与您的问题无关
    • 我的电脑显示了您的代码。它说“找不到符号 pcs” :) 你可以修复它。谢谢。我试试
    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多