我有一个名为x的Integer
;如果它改变了,那么我想在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调用。我该怎么办?
答案 0 :(得分:8)
问题的答案是“不 - 你不能”和“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();
}
});