如何在JAVA中进行通知?

时间:2012-09-04 18:44:18

标签: java events notifications

我正在阅读有关Event Style架构的内容并且遇到了这个

  

提供通知的方式有多种,但最常见   技术使用通过指针进行的间接方法调用   在运行时初始化。

但是当Java没有指针时,它如何传递通知?

2 个答案:

答案 0 :(得分:1)

Java的事件系统基于Observer模式,除了在Java Swing中,一切都被称为“监听器”而不是“观察者”,并且通常实现EventListener(正如您可以从中看到的)野兽在该链接的顶部)。

例如,诸如JButton之类的组件允许您向其添加监听器,该监听器关心按钮何时发生。如果您的听众关注按钮点击,您可以在按钮上添加ActionListenerJButton将其添加到内部列表中以便稍后使用(具体来说,它使用EventListenerList)。当用户单击该按钮时,JButton类将“触发”事件到已向其注册的所有ActionListener实现。

这基本上是观察者模式,因为你有一个被观察的主体(JButton)和一个想要被告知主体的变化或事件(ActionListener)的观察者。

Java本身没有指针,但这并不意味着无法完成。在C ++中,您将传递一个指向主题的函数指针,主题只会调用该函数。由于Java没有函数指针,因此将实现特定接口的对象传递给主题,主题将在接口上调用精确方法。在上面的示例中,这将是ActionListener.actionPerformed(ActionEvent)方法。

请注意,除了Swing之外,这种方法在其他Java库中也很流行,因为缺少函数指针和Java接口的流行等机制。

答案 1 :(得分:1)

Java Swing使用侦听器来发送有关事件的通知。

以下是Swing类的代码片段

        Font font = model.getActivityFont();
        activityTextFontButton = new JButton(getFontText(font));
        activityTextFontButton.setFont(font);
        activityTextFontButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                JFontChooser fontChooser = new JFontChooser();
                fontChooser.setSelectedFont(model.getActivityFont());
                int result = fontChooser.showDialog(dialog);
                if (result == JFontChooser.OK_OPTION) {
                    Font font = fontChooser.getSelectedFont();
                    String text = getFontText(font);
                    model.setActivityFont(font);
                    activityTextFontButton.setText(text);
                    activityTextFontButton.setFont(font);
                    JButton dummy = new JButton(text);
                    setButtonSizes(activityTextFontButton, 
                            connectorTextFontButton, dummy);
                    dialog.validate();
                    dialog.pack();
                }
            }
        });

按下该按钮时,JButton类将执行ActionListener的代码。那是因为JButton类具有对ActionListener实例的引用,并且知道要执行的方法是actionPerformed。

Java中还有其他方法可以驱动事件(请参阅Observer / Observed类),但是侦听器是一种非常酷的方式来传递有关事件的通知。