我是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();
}
});
}
}
该代码是否被认为是整洁和正确的?有什么我可以改进或需要改变吗?
答案 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)
恕我直言你的代码已经正确(我的意思是它正在运作,不是吗)。 其余的主要是品味(以及代码的可用性)。例如,您可能希望稍后重用代码,或者将功能和其他按钮添加到您尚未考虑的程序中。因此,请尝试以下经验法则:
对于编译器,它不会有任何区别,但是当你的项目开始增长并变得越来越复杂时,对你来说。