Могу ли я использовать ObjectChangeListener для прослушивания изменений любого объекта? - PullRequest
1 голос
/ 28 августа 2009

У меня есть Integer под названием 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 не может понять, изменяется ли она или нет, даже если слушатель слушает. Все, что я делаю, это слушаю y, что равно x. Когда x изменяется, y не понимает, потому что x не вызывает по ссылкам. Что я могу сделать?

1 Ответ

8 голосов
/ 28 августа 2009

Ответ на вопрос: "нет - вы не можете" и "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 для приложений для поиска ресурсов, таких как источники данных или информация о конфигурации.

Чтобы сделать то, что вы действительно хотите , вам нужно реализовать некоторый класс, который обернет ваше целое число и использует механизм property-change в 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();
  }
});
...