在ActionPerformed上返回变量

时间:2013-10-17 17:05:41

标签: java swing actionlistener jmenuitem jmenubar

我创建了一个代码,无论何时单击jmenuitem,New Game int x的值都为1,但遗憾的是它不会返回任何值

    package sprite;

    import java.awt.event.*;

    import javax.swing.*;
    import  sprite.Intro;
    import sprite.Fishes;

    public class Ken{

    static int x;

    public static void main(String args[])
    {   
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame f = new JFrame("Save the FISH.");
        Fishes fs = new Fishes();
        Intro in = new Intro();
        Arrow a = new Arrow();          
        f.setResizable(false);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800,600);
        if(x == 0){
            f.add(a);
        }           
        if(x == 1){
            f.add(fs);
        }           
        JMenuBar mb = new JMenuBar();
        JMenu opt = new JMenu("Game");
        JMenu sd = new JMenu("Select Difficulty");
        JMenuItem ng = new JMenuItem("New Game");
        JMenuItem ex = new JMenuItem("Exit");
        JMenuItem l1 = new JMenuItem("Easy");
        JMenuItem l2 = new JMenuItem("Average");
        JMenuItem l3 = new JMenuItem("Hard");           
        f.setJMenuBar(mb);    
        mb.add(opt);
        mb.add(sd);         
        opt.add(ng);
        opt.add(ex);            
        sd.add(l1);
        sd.add(l2);
        sd.add(l3);

        class exit implements ActionListener{

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

        class newGame implements ActionListener{

            public void actionPerformed(ActionEvent e) {
                x = 1;
            }
        }           
        ng.addActionListener(new newGame());
        ex.addActionListener(new exit());
    }       
}

我打算做的是x的值为1,所以我可以在另一个类中继续使用它,只要x获得值1,就会出现一个新面板。

1 个答案:

答案 0 :(得分:2)

离开静态世界,创建一个真正的OOP类,一个带有“状态” - 带有实例字段。您可以在actionPerformed中设置实例字段,以解决您的问题。

您的公共静态main方法应该仅用于创建GUI对象并将其设置为运行,就是这样。


修改
你在评论中说,

  你究竟是什么意思?我只是一个新手,我还没有完全理解java中的每一个元素。

抱歉,我的最后一个答案有点匆忙,因为我的午餐时间结束了,我不得不重新开始工作。目前你的程序只不过是一个静态的主方法,所有的东西都试图加入到这个方法中。如果您正在创建最基本的控制台程序,例如向用户询问2个数字,然后添加数字并返回答案,那就没问题,但您不再尝试这样做了。相反,您正在尝试创建一个Swing GUI程序,如果用户以事件驱动的方式与其进行交互,您希望更改其状态,换句话说,如果用户按下按钮或选择一个,则希望它改变状态菜单项。

由于您的需求和要求变得越来越复杂,您的程序结构将需要更改以反映这一点。这是你绝对要求吗?不 - 名为Turing Equivalence的东西告诉我可以在单个静态main方法中编写可以想象的最复杂程序,但由于复杂性增加,程序将变得非常难以理解并且几乎不可能进行调试。

我特别建议您创建一个或多个表现良好的面向对象类,使用非静态变量和非静态方法的类,并使用它们来构建GUI及其模型(非GUI核心, GUI程序应该有)。同样,主要方法应该简短,非常短,并且应该只涉及创建上述类,并将GUI设置为可见,这就是它。

您要做的是研究Java的基本概念,特别是有关如何创建Java类的概念。 Java教程可以帮助您解决这个问题。


编辑2
你的程序还有另一个主要问题,那就是你遇到了新手,通过改变变量的状态,这将神奇地改变以前使用变量的东西。

例如,在程序中使用静态变量x来保存值0或1,然后尝试根据该变量的状态将组件添加到JFrame:

// Code Block (A)
if(x == 0){
   f.add(a);
}           
if(x == 1){
   f.add(fs);
} 

请注意,调用此代码时,程序才会开始运行,因此x的默认值为0,因此{J}将添加a

稍后在ActionListener中,将x的值更改为1:

// Code Block (B)
class newGame implements ActionListener {
   public void actionPerformed(ActionEvent e) {
      x = 1;
    }
}  

但是您需要了解在代码块(B)中更改x的值对JFrame的显示没有影响,因为代码块(A)已经运行并完成,并且永远不会在此程序中再次运行。

解决方案是从(B)内部重新运行代码块(A),我不建议使用,或者更好的是,使用CardLayout交换JFrame中显示的来自Card Block(B)的JPanels

您可以在CardLayout Tutorial了解有关CardLayout的更多信息。另外,请在此网站上查看我之前的答案和代码: