我正在开发一个简单游戏的项目,你可以使用按钮(北,东,西,南)去不同的房间。在我的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";
}
....
}
问题可能是什么?我该如何解决这个问题?我很确定它非常简单,但我是堆栈。
答案 0 :(得分:3)
String
比较是使用String#equals
而不是==
完成的。这将比较String
的实际文本而不是其内存引用...
例如,而不是
if (direction == "north") {....
使用
if ("north".equals(direction)) {...
如果您不关心此案,可以使用......
if ("north".equalsIgnoreCase(direction)) {...
说了这么多,您实际上可以使用enum
来表示路线,这会限制您实际传递给goRoom
的值。
您还可以使用Action
来定义每个按钮的操作,这也意味着您可以使用它们Key Bindings或menus而无需复制任何代码......但这只是我...
<强>更新强>
你也在掩饰自己的价值......
private void goRoom(String direction, String currentRoom)
{
//...
currentRoom = "stateRoom";
更改currentRoom
的值将超出方法范围。这是因为您实际上并没有更改String
对象的内容,而是更改它的内存引用。
相反,要么更改参数的名称,要么只是不要打扰传递,因为您已经可以访问同名的实例字段...
private void goRoom(String direction)
{
//...
currentRoom = "stateRoom";