Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何保存actionlistener的输入,然后与Java中的其他输入进行比较?_Java_Jframe_Actionlistener - Fatal编程技术网

如何保存actionlistener的输入,然后与Java中的其他输入进行比较?

如何保存actionlistener的输入,然后与Java中的其他输入进行比较?,java,jframe,actionlistener,Java,Jframe,Actionlistener,我正在做一个石头-布-剪刀的游戏,两个玩家必须选择是使用石头、布还是剪刀。然后我的程序被用来比较选择。但我在将选择保存为变量时遇到问题。 我可以打印出选择,但我不知道如何在ActionListener之外使用答案 这就是我的代码(有些名字是挪威语的,所以可能有点混乱,但希望你能理解): 您需要使用main方法来创建Oblig8类的实例,然后将其用作JFrame。完成此操作后,可以将其余代码移动到该类的实例方法 然后,您的ActionListeners将在Oblig8类的实例中运行,并且它们将可以

我正在做一个石头-布-剪刀的游戏,两个玩家必须选择是使用石头、布还是剪刀。然后我的程序被用来比较选择。但我在将选择保存为变量时遇到问题。 我可以打印出选择,但我不知道如何在ActionListener之外使用答案

这就是我的代码(有些名字是挪威语的,所以可能有点混乱,但希望你能理解):


您需要使用
main
方法来创建
Oblig8
类的实例,然后将其用作
JFrame
。完成此操作后,可以将其余代码移动到该类的实例方法

然后,您的
ActionListener
s将在
Oblig8
类的实例中运行,并且它们将可以访问其字段和方法。他们将能够写入实例字段,也能够调用实例方法来获得进一步的结果

因此,您的
main
方法可能非常简短:

public static void main(String[] args) {
    Oblig8 oblig8 = new Oblig8();
    oblig8.doSomeStuff();
}
然后可以将所有其他代码移动到
Oblig8
构造函数或其
doSomeStuff
方法中


Oblig8
类添加一些字段,然后让
ActionListener
与它们交互。

您可以在类范围内声明静态int变量,并将答案存储在这些变量中,然后根据需要使用它

public class Oblig8 extends JFrame {

static int valg1;
static int valg2;

public static void main(String[] args) {
    ...

    Spiller1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            valg1 = JOptionPane.showOptionDialog(Frame,
                    "Spiller 1 har trykket",
                    "Stein - Saks - Papir",
                    JOptionPane.YES_NO_CANCEL_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null,
                    muligheter,
                    muligheter[2]);
            System.out.println(valg1);
        }
    });
    ...
}
}

您的问题在于匿名类,它不存储以后要访问的值。由于这些方法基本相同,因此继续创建一个适当的嵌套子类似乎是有效的

static class SpillerButton extends JButton implements ActionListener {
   int valg;

   SpillerButton(String name){
      super(name);
      addActionListener(this);
   }

   public void actionPerformed(ActionEvent evt) {
      valg = JOptionPane.showOptionDialog(null,
              getText()+"har trykket",
              "Stein - Saks - Papir",
              JOptionPane.YES_NO_CANCEL_OPTION,
              JOptionPane.QUESTION_MESSAGE,
              null,
              muligheter,
              muligheter[2]);
     System.out.println(valg);
  }
}
Oblig8
中,
muligheter
可能是一个
final static
常量,但它需要在这个子类可以找到它的地方


现在,不要使用泛型
JButton
s,而是使用
SpillerButton
s,并在需要显示结果时获取值。

您应该遵循使用以小写字母开头的变量名的惯例。这当然是一种快速启动和运行某些程序的方法,但这几乎肯定不是正确的前进方向。尽量避免使用全局变量,并将它们存储为实例字段。(例如,想想如果你想同时打开两扇窗户会发生什么。)@Chiatic security是的,我同意,这不是一个好的设计。为了实现更好的设计,我将创建自己的JFrame或JPanel类,其中的字段保存选定的选项,并将actionPerformed()方法中的逻辑提取到一个单独的方法中,这样逻辑就不会绑定到匿名类。让我们看看OP会说什么:)
static class SpillerButton extends JButton implements ActionListener {
   int valg;

   SpillerButton(String name){
      super(name);
      addActionListener(this);
   }

   public void actionPerformed(ActionEvent evt) {
      valg = JOptionPane.showOptionDialog(null,
              getText()+"har trykket",
              "Stein - Saks - Papir",
              JOptionPane.YES_NO_CANCEL_OPTION,
              JOptionPane.QUESTION_MESSAGE,
              null,
              muligheter,
              muligheter[2]);
     System.out.println(valg);
  }
}