1

我是 Java 新手,我试图用几个按钮和下拉菜单构建一个简单的 GUI。我设法获得了一个工作 GUI,但真正的问题是关于正确使用 actionListener 方法。为了给一个按钮分配一个动作,我在自己的类中插入了每个 actionListener,代码如下:

public class GUI implements something
{
    public static ClientGUI App;
    private JFrame chatWin;
    private JMenuBar menubar;
    private JMenu x;
    private JMenu y;
    private JMenuItem exit;
    private JMenuItem about;


    public GUI()
    {

               /* 
                * some code and parameters
                */

            //creating the menu bar
            JMenuBar menubar = new JMenuBar();
            chatWin.setJMenuBar(menubar);

            JMenu x= new JMenu("menu1");
            menubar.add(x);
            JMenuItem exit = new JMenuItem("menu2");
            x.add(exit);

            JMenu y= new JMenu("Help");
            menubar.add(help);
            JMenuItem about = new JMenuItem("inner menu1");
            y.add(about);

            //action listener for the exit button 
            class exitaction implements ActionListener
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.exit(0);
                }
            }
            exit.addActionListener(new exitaction());

            //action listener for the about button
            class aboutaction implements ActionListener
            {
                public void actionPerformed(ActionEvent e)
                {
                    //some code
                }

            }
        }

    public static void main (String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                App = new GUI();
            }
        });
    }


}

该代码是否被认为是整洁和正确的?有什么我可以改进或需要改变的吗?

4

4 回答 4

2

我遵守规则:

如果动作实现很棒,我会放入一个内部类。

    public MyFrame extends JFrame {

       // componentes creating, etc

        private static class MyShortAction implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e){
                // some big implementation
            }

        }

    }

简短时,我参加了一个匿名课程。

myButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e){
        // some small code
    }

});

如果它被其他组件使用,我会提取到顶级类。

public class MyAction implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e){
        // some small code
    }
}
于 2012-12-11T18:24:39.040 回答
0

它会起作用,但你可以在一个单独的类甚至主类中实现它,而不是为每个按钮创建一个嵌套类......

public class GUI implements something,ActionListener
{
    //...
    public GUI()
    {
        //...
        exit.setActionListener(this);
        about.setActionListener(this);
        //...
    }
    public void actionPerformed(ActionEvent e)
    {
        Object source = e.getSource();
        if(source == exit)
        {
            System.exit(0);
        } else if(source == about)
        {
            //action
        }
    }
}

您还可以为项目设置操作命令并比较字符串而不是对象。

public class GUI implements something,ActionListener
{
    //...
    public GUI()
    {
        //...
        exit.setActionCommand("exit");
        exit.addActionListener(this);

        about.setActionCommand("about");
        about.addActionListener(this);
        //...
    }
    public void actionPerformed(ActionEvent e)
    {
        String action = e.getActionCommand();
        if("exit".equals(action))
        {
            System.exit(0);
        } else if("about".equals(action))
        {
            //action
        }
    }
}
于 2012-12-11T18:05:42.813 回答
0

将动作侦听器添加到按钮的简单直接方法:

//Create the button
JButton button_save = new JButton("Save");
add(button_save);

// Create the listener
button_save.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent arg0) {
    //do your stuff when button clicked
    //ex: disable the button
    button_save.setEnabled(false);
  }
});
于 2012-12-11T18:09:39.407 回答
0

恕我直言,您的代码已经正确(我的意思是它正在工作,不是吗)。其余的主要是品味问题(以及代码的可用性)。例如,您可能希望稍后重用您的代码,或者向您的程序中添加您尚未考虑的功能和其他按钮。因此,请尝试以下经验法则:

  • 避免内部类——你永远不知道何时要在其他地方实例化该类的对象。因此,为每个类使用一个文件(顺便说一下,类应该以大写字母开头)
  • 将ActionListener的每个实现放在它自己的类中。我知道这会破坏您的项目,但您的所有代码都会被清楚地安排,您甚至可以重用这些功能。例如您的退出按钮。也许您决定在程序的其他地方设置第二个退出按钮,然后您可以为这两个按钮提供相同的 ActionListener,从而获得相同的功能。

对于编译器来说,它不会有任何区别,但是对于你来说,当你的项目开始增长并且变得越来越复杂时。

于 2012-12-11T20:22:35.887 回答