1

自从我开始用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 知道何时执行操作。

如果我对第一个问题的解决方案对第二个问题不可靠,请为此帖子提供完整的解决方案。

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

谢谢。

4

3 回答 3

1

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

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

于 2013-09-19T13:23:13.927 回答
0

Thinlet、Luxor、XUI 框架旨在将 GUI 与业务逻辑分开。您还可以使用 MVC 模式使其成为可能。

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

于 2013-09-19T13:18:37.827 回答
0

欢迎来到摇摆开发。

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

如果您的 ActionListener 在其他公共类中,则需要额外的工作才能访问它们。您必须将面板输入到 Handler 构造函数中,并使 GUI 组件可以通过面板上的公共方法访问。毕竟,这正是(匿名的)内部类免费为您提供的。

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

于 2013-09-19T13:19:14.253 回答