Java - 事件处理和反映结果的最佳实践



自从我开始用Java编程以来,每次我想创建一个GUI和更复杂的业务逻辑时,每次我都遇到同样的问题。

  1. 如何将 GUI 部分与逻辑部分完全分离?编辑:也许说"GUI部分从逻辑部分"有点错误。相反,更准确地说是"来自侦听器部分的 GUI 部分",因为我们不想要像编写匿名函数或内部类那样包含大量行的文件。

结果可以是:

public class MainFrame extends JFrame{
    private final Handler handler = new Handler();
    public MainFrame(){
        //some code...
        final JButton b = new JButton("Click Me!");
        b.putClientProperty("command", "some command or a static variable from a some commands class");
        b.addActionListener(this.handler);
    }
}
// another class in another file 
public class Handler implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e){
         if(e.getSource() instanceof JButton){
             final JButton source = (JButton)e.getSource();
             if(source.getClientProperty("command").equals("some command or a static variable from a some commands class")){
                 //do something
             }
         }
    }
}

如果你们中的一些人知道更好的方法,请告诉我。

  1. 如何使 GUI 在执行操作时通过刷新进行响应?因为在上面的例子中,我们写道:

    b.addActionListener(this.handler);
    

因此,只有按钮 B 知道何时执行了该操作。

如果我对第一个问题的解决方案对第二个问题不可靠,请为这篇文章提供完整的解决方案。

我希望这对更多的人有所帮助。

谢谢。

为了避免仅在本地使用的ActionListener的单独类,您可以将它们编写为匿名类。

要在 Java 应用程序中传播事件,可以使用事件总线机制,例如 Guava 的EventBus

Thinlet,Luxor,XUI框架旨在将GUI与业务逻辑分开。 您还可以使用 MVC 模式来实现它。

Thinlet 是一个 GUI 工具包,是一个 Java 类,用于解析 GUI 的层次结构和属性、处理用户交互以及调用业务逻辑。

欢迎来到摇摆开发。

将 ActionListener 实现和面板/框架拆分为两个类仅适用于简单情况。通常,您希望在同一面板中操作其他 GUI 组件。

如果您的 ActionListener 位于其他公共类中,则需要额外的工作才能访问它们。您必须将面板馈送到处理程序构造函数中,并使 GUI 组件可通过面板上的公共方法访问。毕竟,这只是(anonmyous)内部类免费为您提供的。

将操作侦听器维护为面板的内部类对于摆动面板非常常见。如果你不喜欢大的源文件,你可以使用eclipse或IntelliJ的代码折叠机制。

最新更新