Java Swing编程结构:听众应该是几乎所有Swing组件的源吗?

Arv*_*nem 5 java swing listeners structure

我的问题可以归结为:它是Swing编程中的标准结构,它允许侦听器控制新组件(例如新的JPanel)以进行显示和输入,并使新组件的侦听器控制新组件以进行显示和输入,等等到无穷大?或者Java是否需要恢复到某种统一类,它将所有Swing组件按程序顺序连接在一起?

目前,在我的应用程序中仅使用一个JFrame,在我的侦听器中,我的初始JFrame对象作为参数传递给我的所有JPanel,因此他们的侦听器可以调用removeall()来清除新JPanel的帧.例如,短代码如下

public class MainFrame {
  JFrame jfrm;
  public MainFrame() {
    jfrm = new JFrame("Main Frame");
    JPanel mainPanel = new MainPanel(jfrm);
  }
}

public class MainPanel extends JPanel {
  public MainPanel(final JFrame mainFrame) {
    JButton example = new JButton("Example");
    example.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent le) {
            mainFrame.removeall();
            JPanel 2ndPanel = new 2ndPanel(mainFrame);
            mainFrame.add(2ndPanel);
            mainFrame.validate();
        }
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的结构 - 在哪里产生新面板的听众而不是一些统一的类?但是,如果是这样的话,如果有一个级联无限的侦听器,Java的编译器如何获得mainFrame.validate()?我是一个老派程序程序员,试图用Java编写Swing应用程序,我想我可能没有掌握Swing编程的基本概念.期待任何有用的答案,并提前感谢!

And*_*s_D 4

我不会那样做。观察者模式在 Swing 中用于发送通知,通常是用户操作的结果。

举个例子:用户“单击”按钮,因为他想要在 MainFrame 中创建一个新面板。但按钮不知道点击后会做什么。他所能做的就是通知事件侦听器它已被选择。

所以我们需要一些对通知感兴趣的组件。该组件可以向按钮注册监听器并接收通知。听者是其他组件“耳朵”(或者“眼睛”)。但耳朵(或眼睛)不会采取行动。它只是其他组件传感器。

这让我们回到了主要问题:想要被告知,如果按钮被点击,必须采取行动。这是一个主要的设计问题。它绝对不是创建面板并将其添加到主框架的侦听器。它可以是创建和添加子面板的主框架角色,也可以是负责创建带有子面板的框架的第三个组件的角色。

但监听器对于这段代码来说是一个不好的地方。