如何从actionlistener保存输入,然后在Java中与另一个进行比较?

时间:2015-10-26 13:54:49

标签: java jframe actionlistener

我正在制作一个石头剪刀游戏,2名玩家必须选择是否要使用摇滚,纸张或剪刀。然后我的程序被用来比较选择。但是我将选择保存为变量时遇到了问题。 我可以打印出选项,但我不知道如何在actionlisteneres之外使用答案。

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

package oblig8;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

@SuppressWarnings("serial")
public class Oblig8 extends JFrame{

public static void main(String[] args) {
    // TODO Auto-generated method stub
JFrame Frame = new JFrame("Stein - Saks - Papir");
Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Frame.setSize(500, 500);
Frame.setVisible(true);
JButton Spiller1 = new JButton("Spiller 1");
JButton Spiller2 = new JButton("Spiller 2");
Frame.getContentPane().add(Spiller1, BorderLayout.WEST);
Frame.getContentPane().add(Spiller2, BorderLayout.EAST);
String[] muligheter = new String[3];
muligheter[0]="Stein";
muligheter[1]="Saks";
muligheter[2]="Papir";

Spiller1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          int 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);}});
Spiller2.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
      int valg2 = JOptionPane.showOptionDialog(Frame,
              "Spiller 2 har trykket",
              "Stein - Saks - Papir",
              JOptionPane.YES_NO_CANCEL_OPTION,
              JOptionPane.QUESTION_MESSAGE,
              null,
              muligheter,
              muligheter[2]);
      System.out.println(valg2);}});
}}

3 个答案:

答案 0 :(得分:0)

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

您的ActionListener将在Oblig8课程的实例中运行,并且他们可以访问其字段和方法。他们将能够写入实例字段,并且还可以调用实例方法来进一步发生。

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

public static void main(String[] args) {
    Oblig8 oblig8 = new Oblig8();
    oblig8.doSomeStuff();
}

然后,您可以将所有其他代码移入Oblig8构造函数或其doSomeStuff方法。

Oblig8课程中添加一些字段,然后让ActionListener与他们互动。

答案 1 :(得分:0)

您可以在类范围中声明静态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);
        }
    });
    ...
}
}

答案 2 :(得分:0)

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

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);
  }
}

无论如何muligheter final static中的Oblig8常量应该是JButton常量,但它必须是此子类可以找到它的位置。

现在,您可以使用SpillerButton s代替使用通用python run.py s,并在想要显示结果时获取值。