在java中正确使用actionListener

时间:2012-12-11 18:01:35

标签: java user-interface

我是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 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分: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
        }
    }
}

答案 2 :(得分: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);
  }
});

答案 3 :(得分:0)

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

  • 避免使用内部类 - 您永远不知道何时想要在其他地方实例化该类的对象。因此,为每个类使用一个文件(并且btw类应以大写字母开头)
  • 将ActionListener 每个实现放在自己的类中。我知道这会炸毁您的项目,但您的所有代码都将清晰排列,您甚至可以重用这些功能。例如你的退出按钮。也许你决定在程序的其他地方有第二个退出按钮,然后你可以给这两个按钮提供相同的ActionListener,从而实现相同的功能。

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