我有一个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调用。 我能做什么?
该问题的答案是“不-你不能”和“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();
}
});