我正在为一个简单游戏做一个项目,在这个项目中,你可以使用按钮(北、东、西、南)进入不同的房间。在我的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";
}
....
}
可能是什么问题?我该怎么解决?我很确定这是一件非常简单的事情,但我很累。
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";