操作侦听器将变量的当前值重置为默认值



我正在为一个简单游戏做一个项目,在这个项目中,你可以使用按钮(北、东、西、南)进入不同的房间。在我的gui的makeFrame()方法中,我正在创建面板、按钮等。例如,我将默认房间设置为"hall",actionlistener调用方法goRoom,并将direction和currentRoom传递给该方法。goRoom方法根据currentRoom将currentRoom更改为另一个房间。我加入了打印声明,看看它是否有效,到目前为止效果良好。

每次游戏开始时,默认的房间是大厅。因此,当你点击一个按钮进入例如"北方"时,会调用northButton,然后我们将通过方向(北方)的goRoom方法和默认房间称为"大厅"(因为游戏刚刚开始并使用默认房间)。然后,房间从大厅变为状态房间(在方法goRoom中)。当我尝试按下另一个按钮时,currentRoom重置为默认值(霍尔)。

我认为动作侦听器从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";
}
....
}

可能是什么问题?我该怎么解决?我很确定这是一件非常简单的事情,但我很累。

Java中的String比较是用String#equals而不是==进行的。这将比较String的实际文本,而不是其内存引用。。。

例如,代替

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

使用

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

如果你不在乎这个案子,你可以用。。。

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

话虽如此,您实际上可以使用enum来表示方向,这限制了您可以实际传递给goRoom的值。

您还可以使用Action来定义每个按钮的操作,这也意味着您可以使用它们的键绑定或菜单,而不必复制任何代码。。。但那只是我…

更新

你也在追随你的价值观。。。

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

更改currentRoom的值不会产生超出该方法范围的影响。这是因为您实际上并没有更改String对象的内容,而是更改了它的内存引用。

相反,可以更改参数的名称,或者,简单地不必传递,因为您已经可以访问相同名称的实例字段。。。

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

相关内容

  • 没有找到相关文章

最新更新