尝试在JButton上执行一次方法

时间:2013-05-25 19:40:58

标签: java swing action listener jbutton

我正在开展一个java项目,让我在夏天忙碌。我刚刚完成了大学的第一年,所以我掌握了Java的基本知识及其工作原理。对于我的项目,我决定选择你自己的冒险游戏。如果给用户一些对话,那么他们将获得两种选择。到目前为止它进展顺利,我遇到了一个我无法解决问题的缺陷。下面是我的小学课程的代码。


public DisplayPanel() {
        core = new Core();
        stat = new StatusPanel();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Quest!");

        middle = new JPanel();
        bottom = new JPanel();
        left = new JButton("Explore");
        right = new JButton("Think");
        textArea = new JTextArea();

        middle.setLayout(new GridLayout(1, 1));
        middle.add(textArea);
        bottom.add(stat);


        left.addActionListener(this);
        right.addActionListener(this);


        setLayout(new BorderLayout());
        add(left, BorderLayout.WEST);
        add(right, BorderLayout.EAST);
        add(middle, BorderLayout.CENTER);
        add(bottom, BorderLayout.SOUTH);

        changeText("You wake up in a strange woods and walk forwards into the mist\n " +
                "You decide whether it's best to think how you got here " +
                "\n or search the area for clues");



        setSize(600, 700);
        setResizable(false);
        setVisible(true);

    }

    public static void changeText(String newText) {
        textArea.setText(newText);
    }

    public static void appendText(String newText) {
        textArea.append(newText);
    }


    public void actionPerformed(ActionEvent e) {

        String cmd = e.getActionCommand();
        Monsters m = new Monsters();


        try {
            core.load("goblinstier1.txt");
        } catch (IOException e1) {
            e1.printStackTrace();
        }


        /////////////////////////////////////////////////////////////////////////
        /////////////////////////////LEFT/////OPTION1////////////////////////////
        /////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////
        //////////////////////////////ORIGINAL CHOICE////////////////////////////
        /////////////////////////////////////////////////////////////////////////

        if(e.getSource() == left) {
            textArea.setText("You explore the area for clues and hear a rustling in a bush.\n " +
                    "It might be someone who can help? Or it could be a monster! \n" +
                    "You ready your knife in preperation!\n");
            stat.incrementClickCount();

            option2a = new JButton("Talk");
            option2a.addActionListener(this);
            option2a.setActionCommand("left2a"); 
            add(option2a, BorderLayout.WEST);

            option2b = new JButton("Leave");
            option2b.addActionListener(this);
            option2b.setActionCommand("right2b"); 
            add(option2b, BorderLayout.EAST);

            right.setVisible(false);
            left.setVisible(false);


        }


        /////////////////////////////////////////////////////////////////////////
        ////////////////////////////LEFTA/////OPTION2////////////////////////////
        /////////////////////////////////////////////////////////////////////////
        Monsters temp = null;
        temp = core.anyMonster();




        if(cmd == "left2a") {
            option2a.setText("Attack!");
            option2b.setText("Flee!");
            stat.incrementClickCount();
            fightClick++;



                if(fightClick >=2) {

                    appendText("You grip your shiv and cleave!");
                    temp.cleave();

                    if(temp.getHealth()<=0) {
                        appendText("You have " +stat.getHealth2()+ " health remaining ");
                        stat.gold();
                        stat.xp();

                    }else {
                        stat.hit();
                    }
                }

        }

我的问题在于LEFTA选项二,我试图编写一种用户有机会战斗或逃离的战斗系统。它的工作方式是我的核心类中的一个名为anyMonster的方法,我将在下面显示它。

public Monsters anyMonster() {
        int index = randomGenerator.nextInt(monsters.size());
        Monsters monsters1 = monsters.get(index);
        DisplayPanel.changeText("A monster appears! It's a " + monsters1 + "!\n What shall you do?\n");
        return monsters1;
    }

该方法循环通过预先设置的arrayList并随机选择“怪物”。正如您在DisplayPanel中看到的那样,我试图在actionPerformed类中调用它,然后如果用户按下按钮,它将攻击怪物,代码如下。

public void cleave()
    {
        randomNum = 7 + (int)(Math.random() * ((10 - 7) + 1));

        newHealth=health-randomNum;
        health=newHealth;
        DisplayPanel.appendText(" You attack for " +randomNum+ " Damage, it has " +health+ " health remaining!\n ");
        if(health<=0){
            DisplayPanel.appendText("The monster falls to the ground");
        }
}
}

我在DisplayPanel中完成这项工作的方法是将方法分配给临时值,然后从有效的方法调用cleave()方法。问题是,每次我点击按钮,每次都会选择一个新怪物。我意识到为什么会发生这种情况,当然它是一个按钮,它每次都会做同样的动作。问题是我完全没有关于如何解决这个问题的想法。这是令人沮丧的,我真的想继续我的项目,你可以给新手的任何帮助将非常感激。罗伯,提前谢谢。

1 个答案:

答案 0 :(得分:0)

不是在actionPerformed中创建你的大教堂,你应该将它创建为一个字段,这样你的怪物只会被创建一次。