我创建了一个代码,无论何时单击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,就会出现一个新面板。
答案 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的更多信息。另外,请在此网站上查看我之前的答案和代码: