[英]How do JButtons in advanced applications work?
用Java编写的软件中的按钮如何工作?
例如上面的屏幕截图:当用户单击不同的按钮时,对用户输入的数据(这是一个数据分析应用程序)运行不同的算法,并显示输出。 不过,刚开始编写Java GUI的时候,对我来说,这似乎就像魔术一样-每个窗格都有一个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)。
我认为您在用户界面中所做的所有事情也应该可以通过API来完成。 好处是易于测试,可以重新设计UI,而不会弄乱您的逻辑,易于在后台线程上执行繁重的工作,...。
拙劣的对话框文章很好地描述了这一点。 并非特定于Swing,但适用于所有类型的UI。
要回答您的问题:
每个窗格都有一个ActionListener吗?
不,通常每个按钮都有一个Action
(或ActionListener
)。 我更喜欢使用Action
实例,因为它们比典型的匿名ActionListener
更可重用(并且也更易于测试)
它是否监听不同按钮的不同ActionCommand并在actionPerformed()方法内执行算法
当然不是。 在该方法中进行大量计算将阻塞Swing UI线程(事件调度线程),这会导致在进行计算时UI不响应。 显示进度也变得不可能。 计算通常是在工作线程上完成的,该工作线程是在触发您的Action
启动的(例如,使用SwingWorker
)。 Swing中的并发教程对此进行了说明。
在我看来,以独立于数据的方法执行算法有点不直观……即按钮不知道它正在处理什么数据?
该按钮不应该知道数据。 数据通常存储在模型中。 UI仅显示它,但不包含它(除非它只是由用户提供的输入)。 该按钮应该只知道在模型上调用什么。 该模型将执行其所有操作并触发一个事件。 UI拾取该事件并进行自我更新。
至少,这就是Swing的设计方式(例如JTable
及其TableModel
)。 我没有充分的理由在制作自己的Swing UI时不遵循该模型
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.