【问题标题】:define button actions in inner class Vs define button actions in public class in swing在内部类中定义按钮动作与在摆动的公共类中定义按钮动作
【发布时间】:2012-10-06 17:03:20
【问题描述】:

我有一个对话框,其中有四个按钮,分别是新建、保存、删除、取消。现在,这些中的每一个都需要执行它们的操作。所以我定义了一个单独的类来实现ActionListener。我已经使用这个类来执行每个按钮操作。

public class MyClass implements ActionListener {
  public void actionPerformed(ActionEvent e) { 
   if(e.getActionCommand().toString() == "OK") {
        // Code
   } else if( .. ){

   }
  }
}

我所做的是,我定义了一个用于执行相同功能的内部类。但我没有得到的是,最好的做法是编写一个单独的类还是最好使用内部类。有人建议我在公共课上写作,以便明天有人可以使用这门课来执行他们的行动。所以我有以下问题,

  1. 如果任何对象都没有调用该功能(我不能说),那么我可以在内部类中编写它吗?或者

  2. 始终编写执行该对话框操作的内部类是否是一种好习惯?

【问题讨论】:

  • 对于按钮调用的可重用操作,我会说:使用Action 类而不是ActionListener。另见this answer

标签: java swing jbutton actionlistener


【解决方案1】:

当您谈到为 GUI 侦听器定义内部类时,我立即想到使用匿名类来完成这项工作:

newButton.addActionListener(
    new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            // do the work for a button press
        }
    });      

// similarly for save, cancel, delete buttons:
saveButton.addActionListener(
    new ActionListener()
    {
        // ...

你会经常看到这个,我经常在我自己的代码中使用它。

你使用哪个取决于你的代码结构,例如:

  • 每个听众需要做多少工作
  • 处理程序之间共享多少代码

如果每个处理程序都很短(例如,只有一个方法调用,而所有实际工作都在另一个类方法中处理),我会以这种方式使用匿名类。但它看起来确实很傻:不幸的是,java 要求我们定义一个对象来使用回调方法。

这也是个人喜好和编码风格的问题。

但是,我很少像您的示例那样为 GUI 处理程序创建一个新的顶级类:即使我将类分开以便为每个按钮使用相同的类,我也会在其中定义类控制按钮的类文件,可以作为非公共顶级类,也可以作为内部(非匿名)类。如果 GUI 回调的复杂性增长到需要一个单独的类,我就会开始寻找重构的地方。

【讨论】:

    【解决方案2】:

    这些问题没有一般的答案。如果actionPerformed()中的代码是一行,写一个完整的类文件通常是大材小用。

    如果代码更复杂,它可能适合重用,但随着代码的增长,它也会变得更加具体(所以你不能再重用它了)。

    尝试遵循这种方法:

    • 从相互独立的简单块构建您的应用程序。
    • 通过编写连接块的代码来配置应用程序。

    因此,在您的情况下,您可以使用辅助方法来完成工作。将它们包裹在Swing Actions中;这允许您在各种按钮和菜单中使用它们。

    尝试将尽可能多的工作转移到助手中,以使操作变得非常简单。如果有疑问,问问自己:这段代码是工作的一部分吗?每个人都需要这样做吗?

    如果是,那么代码应该进入一个工作/帮助类。

    如果是与 UI 相关的检查(可见/启用)、转换(字符串到数字)、验证等,它应该进入操作。

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-02
        • 2019-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多