Java 高级应用程序中的JButtons是如何工作的?
用Java编写的软件中的按钮是如何工作的 例如,上面的屏幕截图:当用户单击不同的按钮时,会对用户输入的数据(这是一个数据分析应用程序)运行不同的算法,并显示输出。尽管刚刚开始编写JavaGUI,但对我来说这一切似乎都很神奇——每个窗格是否都有一个ActionListener?它是否侦听不同按钮的不同ActionCommand并在actionPerformed()方法中执行算法(在独立于数据的方法中执行算法对我来说似乎有点不直观…即按钮不知道它处理的是什么数据?)。到目前为止,我在网上读到的所有action listener教程都只是在按下按钮时打印了一些内容 连接按钮、actionlisteners和在后台执行的实际操作的一般结构是什么Java 高级应用程序中的JButtons是如何工作的?,java,swing,user-interface,jbutton,actionlistener,Java,Swing,User Interface,Jbutton,Actionlistener,用Java编写的软件中的按钮是如何工作的 例如,上面的屏幕截图:当用户单击不同的按钮时,会对用户输入的数据(这是一个数据分析应用程序)运行不同的算法,并显示输出。尽管刚刚开始编写JavaGUI,但对我来说这一切似乎都很神奇——每个窗格是否都有一个ActionListener?它是否侦听不同按钮的不同ActionCommand并在actionPerformed()方法中执行算法(在独立于数据的方法中执行算法对我来说似乎有点不直观…即按钮不知道它处理的是什么数据?)。到目前为止,我在网上读到的所有
提前感谢。通常的方法是每个按钮有一个动作监听器。
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时,没有充分的理由不遵循该模型