高级应用程序中的JButton如何工作?

时间:2013-11-30 17:40:49

标签: java swing user-interface jbutton actionlistener

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

http://i.stack.imgur.com/fCbRQ.png

例如上面的屏幕截图:当用户点击不同的按钮时,对用户输入的数据(它是数据分析应用程序)运行不同的算法并显示输出。刚刚开始编写Java GUI,这对我来说似乎都很神奇 - 每个窗格都有一个ActionListener吗?它是否监听不同按钮的不同ActionCommands并在actionPerformed()方法中执行算法(在一个独立于数据的方法中执行算法似乎有点不直观...即按钮不知道是什么它处理的数据?)。到目前为止,我在线阅读的所有动作监听器教程仅在按下按钮时打印出来......

连接按钮,动作侦测器以及在后台执行的实际操作的一般结构是什么?

提前致谢。

2 个答案:

答案 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时,我没有理由不遵循该模型