用Java编写的软件中的按钮如何工作?
例如上面的屏幕截图:当用户点击不同的按钮时,对用户输入的数据(它是数据分析应用程序)运行不同的算法并显示输出。刚刚开始编写Java GUI,这对我来说似乎都很神奇 - 每个窗格都有一个ActionListener吗?它是否监听不同按钮的不同ActionCommands并在actionPerformed()方法中执行算法(在一个独立于数据的方法中执行算法似乎有点不直观...即按钮不知道是什么它处理的数据?)。到目前为止,我在线阅读的所有动作监听器教程仅在按下按钮时打印出来......
连接按钮,动作侦测器以及在后台执行的实际操作的一般结构是什么?
提前致谢。
答案 0 :(得分:1)
通常的方法是每个按钮有一个动作监听器。 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));
}
答案 1 :(得分:1)
我个人的偏好是在UI中几乎什么都不做,但是把它全部移到模型/控制器端(不知道最好的名字是什么,因为它很少是纯粹的MVC)。
我认为你在UI中所做的一切也应该通过API来实现。优点是更容易测试,重新设计UI是可能的,而不会弄乱你的逻辑,很容易在后台线程上执行繁重的工作,....
描述这一点的好读物是Humble Dialog文章。不是特定的Swing,但适用于所有类型的UI。
回答你的问题:
每个窗格都有一个ActionListener吗?
不,通常每个按钮都有一个Action
(或ActionListener
)。我更喜欢使用Action
个实例,因为它们比典型的匿名ActionListener
更容易重复使用(并且更容易测试)
它是否侦听不同按钮的不同ActionCommands并在actionPerformed()方法中执行算法
当然不是。在该方法中进行大量计算将阻止Swing UI线程(事件调度线程),这会导致计算正在进行时无响应的UI。显示进展也变得不可能。计算通常在工作线程上完成,在触发Action
时启动(例如使用SwingWorker
)。这在Concurrency in Swing教程中进行了解释。
在一个独立于数据的方法中执行算法似乎有点不直观。按钮不知道它正在处理什么数据?
按钮不应该知道数据。数据通常存储在模型中。 UI仅显示它,但不包含它(除非它是由用户提供的输入)。按钮应该只知道模型上要调用的内容。该模型可以完成任何必要的操作并触发事件。用户界面选择该事件并自行更新。
至少,这就是Swing的设计方式(例如JTable
及其TableModel
)。在创建自己的Swing UI时,我没有理由不遵循该模型