将组件分成类

时间:2013-05-19 18:14:03

标签: java swing user-interface

我正在创建一个“GUI”应用程序,目的是使代码清晰,并将这些“GUI”组件分成几个类(你会在下面看到我的意思),现在用于菜单栏,但我现在很想知道,因为我想对它们实现ActionListener,最好在哪个类中进行,例如在这个菜单栏类的情况下,在他的类中实现,或者在Main中实现动作监听器而不是实现抽象方法将使用我们想要执行操作的方法吗?

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;

public final class Main extends JFrame {

    private MenuBar menuBar;

    public Main() {
        setTitle("GUI");
        setSize(300, 200);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        initGUI();
    }

    public void initGUI() {
        menuBar = new MenuBar(this);
        // this is last update before I started posting this, I decided to
        // access exitMenu variable and than to addActionListener to it from a here, which is currently not working
        menuBar.exitMenu.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        new Main();
    }

}

菜单栏类:

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;

public final class MenuBar {

    public JMenu newMenu;
    public JMenu aboutMeMenu;
    public JMenu exitMenu;

    public MenuBar(JFrame jFrame) {
        JMenuBar menubar = new JMenuBar();

        initNew(menubar);
        initAboutMe(menubar);
        initExit(menubar);

        jFrame.setJMenuBar(menubar);
    }

    public void initNew(JMenuBar menubar) {
        newMenu = new JMenu("New");  
        menubar.add(newMenu);
    }

    public void initAboutMe(JMenuBar menubar) {
        aboutMeMenu = new JMenu("About Me");  
        menubar.add(aboutMeMenu);
    }

    public void initExit(JMenuBar menubar) {
        exitMenu = new JMenu("Exit");
        menubar.add(exitMenu);
    }


}

1 个答案:

答案 0 :(得分:3)

一种标准方法是让您的Main类或某个类与Main完全“接近”,处理所有或大部分操作。通常会有一个基于action.getActionCommand()的巨型switch语句,它将控制传递给适当的函数。我不喜欢这种方法,但它的优势在于它很容易理解。

IMO远远优越的方法是创建AbstractActions并与它们挂钩。它们可以以适用于您的应用程序的任何方式进行组织。好的是它们很好地封装,感觉更像“类似OO”等等。此外,多个GUI元素可以共享一个动作。例如按钮和菜单都可以调用“SaveFileAction”操作。并且可以集中启用和禁用操作。如果没有要保存的文件,则可以相当轻松地禁用“SaveFileAction”。