Java 高级应用程序中的JButtons是如何工作的?

Java 高级应用程序中的JButtons是如何工作的?,java,swing,user-interface,jbutton,actionlistener,Java,Swing,User Interface,Jbutton,Actionlistener,用Java编写的软件中的按钮是如何工作的 例如,上面的屏幕截图:当用户单击不同的按钮时,会对用户输入的数据(这是一个数据分析应用程序)运行不同的算法,并显示输出。尽管刚刚开始编写JavaGUI,但对我来说这一切似乎都很神奇——每个窗格是否都有一个ActionListener?它是否侦听不同按钮的不同ActionCommand并在actionPerformed()方法中执行算法(在独立于数据的方法中执行算法对我来说似乎有点不直观…即按钮不知道它处理的是什么数据?)。到目前为止,我在网上读到的所有

用Java编写的软件中的按钮是如何工作的

例如,上面的屏幕截图:当用户单击不同的按钮时,会对用户输入的数据(这是一个数据分析应用程序)运行不同的算法,并显示输出。尽管刚刚开始编写JavaGUI,但对我来说这一切似乎都很神奇——每个窗格是否都有一个ActionListener?它是否侦听不同按钮的不同ActionCommand并在actionPerformed()方法中执行算法(在独立于数据的方法中执行算法对我来说似乎有点不直观…即按钮不知道它处理的是什么数据?)。到目前为止,我在网上读到的所有action listener教程都只是在按下按钮时打印了一些内容

连接按钮、actionlisteners和在后台执行的实际操作的一般结构是什么


提前感谢。

通常的方法是每个按钮有一个动作监听器。
Statistics
面板可以访问(通过其中一个字段)需要读取和修改的数据。因此,此面板中第一个按钮的处理方式可能如下所示:

private void initButtonListeners() {
    this.averageDegreeButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            computeAverageDegree();
        }
    }

    // other buttons...
}
computeAverageDegree()
方法可能如下所示

private void computeAverageDegree() {
    double result = this.statistics.computeAverageDegree();
    this.averageDegreeLabel.setText(formatDoubleToString(result));
}

我个人的偏好是在UI中几乎什么都不做,而是将其全部移动到模型/控制器端(不确定最好的名称是什么,因为它很少是纯MVC)

我认为您在UI中所做的一切都应该可以通过API来实现。好处是更容易测试,可以在不破坏逻辑的情况下重新设计UI,易于在后台线程上执行繁重的工作

这篇文章很好地描述了这一点。不是真正特定于Swing,但适用于所有类型的UI

回答您的问题:

是否每个窗格都有一个ActionListener

不,通常每个按钮都有一个
操作
(或
操作侦听器
)。我更喜欢使用
Action
实例,因为它们比典型的匿名
ActionListener
更易于重用(而且更易于测试)

它是否侦听不同按钮的不同ActionCommand并在actionPerformed()方法中执行算法

当然不是。在该方法中执行繁重的计算将阻塞Swing UI线程(事件调度线程),这将导致在计算过程中出现无响应UI。显示进步也是不可能的。计算通常在工作线程上完成,在触发
操作时启动(例如使用
SwingWorker
)。本教程对此进行了解释

对我来说,用一种独立于数据的方法来执行算法似乎有点不直观。按钮不知道它在处理什么数据

按钮不应该知道数据。数据通常存储在模型中。UI只显示它,但不包含它(除非它是用户刚刚提供的输入)。按钮应该知道在模型上调用什么。模型执行它必须执行的任何操作并触发事件。UI拾取该事件并更新自身

至少,Swing就是这样设计的(例如
JTable
及其
TableModel
)。因此,在创建自己的Swing UI时,没有充分的理由不遵循该模型