ActionListener将变量的当前值重置为默认值

时间:2014-01-12 22:32:16

标签: java swing user-interface compare actionlistener

我正在开发一个简单游戏的项目,你可以使用按钮(北,东,西,南)去不同的房间。在我的gui的makeFrame()方法中,我正在创建面板,按钮等。然后我将默认房间设置为“hall”,例如actionlistener调用方法goRoom并将direction和currentRoom传递给该方法。 goRoom方法根据currentRoom将currentRoom更改为另一个房间。我包含了print语句,看看它是否有效,到目前为止一切正常。

每次游戏开始时,默认房间都是大厅。 所以当你单击一个按钮例如“North”时,会调用northButton,然后我们调用goRoom方法传递方向(北)和默认房间“hall”(因为游戏刚开始并使用默认房间) )。 然后房间从大厅变为州室(在方法goRoom内)。当我尝试按另一个按钮时,currentRoom重置为默认值(hall)。

我认为动作侦听器从makeFrame()方法获取值,而不是goRoom方法中的更新值。代码如下:

public class StoreGUI extends JFrame
{
    public String currentRoom;

    public StoreGUI()
    {
        makeFrame();
    }


    private void makeFrame()
    { 
        currentRoom = "hall";
        ....


        northButton = new JButton("Go North");
        northButton.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { 
                                   direction = "north";
                                   goRoom(direction, currentRoom); }
                           });
        toolbar.add(northButton);

        westButton ....
        southButton ....      
        eastButton ....

        picture.setIcon(new ImageIcon("image/hall.png"));
        frame.getContentPane().add(picture);
        frame.pack();
        frame.setVisible(true);
    }

private void goRoom(String direction, String currentRoom)
    {
        // get current room and check which direction button the user has pressed
        if (direction == "north"){
            if(currentRoom == "hall"){
                // Inserts the image icon and change currentRoom
                imgageTitle = "image/stateRoom.png";
                currentRoom = "stateRoom";
            }
            ....
}

问题可能是什么?我该如何解决这个问题?我很确定它非常简单,但我是堆栈。

1 个答案:

答案 0 :(得分:3)

Java中的{p> String比较是使用String#equals而不是==完成的。这将比较String的实际文本而不是其内存引用...

例如,而不是

if (direction == "north") {....

使用

if ("north".equals(direction)) {...

如果您不关心此案,可以使用......

if ("north".equalsIgnoreCase(direction)) {...

说了这么多,您实际上可以使用enum来表示路线,这会限制您实际传递给goRoom的值。

您还可以使用Action来定义每个按钮的操作,这也意味着您可以使用它们Key Bindingsmenus而无需复制任何代码......但这只是我...

<强>更新

你也在掩饰自己的价值......

private void goRoom(String direction, String currentRoom)
{
    //...
    currentRoom = "stateRoom";

更改currentRoom的值将超出方法范围。这是因为您实际上并没有更改String对象的内容,而是更改它的内存引用。

相反,要么更改参数的名称,要么只是不要打扰传递,因为您已经可以访问同名的实例字段...

private void goRoom(String direction)
{
    //...
    currentRoom = "stateRoom";