2

我正在阅读有关事件样式架构的内容并遇到了这个

有不同的方法来传递通知,但最常见的技术使用间接方法调用,该方法调用是通过在运行时初始化的指针进行的。

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

4

2 回答 2

1

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

例如,像 a 这样的组件JButton允许您向其添加侦听器,以关注按钮何时发生某些事情。如果您的听众关心按钮点击,您可以添加一个ActionListener按钮,JButton并将其添加到一个内部列表以供以后使用(具体来说,它使用EventListenerList)。当用户单击该按钮时,JButton该类将“触发”一个事件给ActionListener已向其注册的所有实现。

这基本上是观察者模式,因为您有一个正在被观察的主题(JButton)和一个希望收到有关主题更改或事件的通知的观察者(ActionListener)。

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

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

于 2012-09-04T19:01:35.080 回答
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 类),但侦听器是传递有关事件的通知的一种非常酷的方法。

于 2012-09-04T19:03:21.447 回答