0

嗨,我想知道如何在 Java 中获取共享事件让我向你解释我想做什么

首先我有一个控制器类所有它的方法都是静态的

类交通控制器 {

公共静态无效控制流量(){

// 做某事 //>> 我想通知这个动作已经完成 }

}

在另一边我有一个听众

class TrafficListener{
public static void watchNewTraffic()
{ //当新流量出现时做一些事情 } }

有任何人知道我该如何处理

我发现有 Observer 和 Observable 但我需要实现 Observer 的方法我也发现 Propertychangelistener 在我的情况下没用,因为我有静态方法

4

3 回答 3

0

首先,您应该从方法中删除static修饰符。TrafficListener.watchNewTraffic()否则,您不能有多个侦听器。更好的是,您应该制作TrafficListener一个界面:

interface TrafficListener {
    void watchNewTraffic();
}

每个想成为监听器的类都需要实现接口。然后,您可以在TrafficController类中维护一组侦听器:

class TrafficController {
    private static Set<TrafficListener> listeners = new HashSet<>();

    public static void controlTraffic() {
        // do stuff
        notifyListeners();
    }

    public static void addTrafficListener(TrafficListener listener) {
        listeners.add(listener);
    }

    public static void removeTrafficListener(TrafficListener listener) {
        listeners.remove(listener);
    }

    private static void notifyListeners() {
        for (TrafficListener listener : listeners) {
            listener.watchNewTraffic();
        }
    }
}

不过,目前尚不清楚您要完成什么。关于您的问题的某些内容向我表明您应该考虑使用生产者-消费者模式而不是观察者模式

于 2013-08-23T17:16:22.517 回答
0

在这里使用静态方法似乎很奇怪。一种常见的方法是创建一个侦听器列表,然后在引发事件时调用这些侦听器。不过,这需要一个实例。

所有这些方法都是静态的是否有特定原因?在这种情况下,打电话似乎并没有那么糟糕watchNewTraffic()controlTraffic()

或者创建一个侦听器,该侦听器依次调用watchNewTraffic(). 我将扩展 Ted 的示例。

class StaticTrafficListener implements TrafficListener {
  public void watchNewTraffic() {
    TrafficWatcher.watchNewTraffic();  //this would be your TrafficListener which I renamed for this example to make sense ;)
  }
}
于 2013-08-23T17:17:59.800 回答
0

您可以在 TriafficController 类中构建一个内部类并将其命名为 eventHandler 或其他任何东西,然后您可以从 i 获取一个对象

public class TriafficController  extends JFrame {

private JButton button;
private JButton button2;

// the constructor 
public TriafficController  (){


button = new JButton("push me");
button2 = new JButton("push me 2");
add(button);
add(button2);

// handler is an object of a inner class we will create latter , this object you can share it with and component

eventHandler handler = new eventHandler();

button.addActionListener(handler);
button2.addActionListener(handler);


}
// out of the constructor we will build the inner class
private class eventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent event)

{

  // code your action here , when ever you post your object 'handler' this method will performed

}


}

}
于 2013-08-23T17:24:51.413 回答