2014-01-12 6 views
0

Я работаю над проектом для простой игры, где вы можете пойти в разные комнаты, используя кнопки (север, восток, запад, юг). В методе makeFrame() моего gui я создаю панель, кнопки и т. Д. Затем я установил комнату по умолчанию для «зала», и actionlistener вызывает метод goRoom и передает направление и currentRoom этому методу. Метод goRoom меняет currentRoom на другую комнату в зависимости от текущегоRoom. Я включил инструкции печати, чтобы убедиться, что он работает, и пока он работает нормально.Текущее значение переменной сброса ActionListener по умолчанию

Каждый раз, когда игра начинается по умолчанию, зал представляет собой зал. Итак, когда вы нажимаете кнопку, например «Север», вызывается 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"; 
      } 
      .... 
} 

В чем проблема? Как я могу это исправить? Я почти уверен, что это действительно просто, но я стоп.

ответ

3

String сравнение в Java делается 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"; 
+0

Я попробовал оба, но я получил та же проблема. Он продолжает изменять текущую комнату до значения по умолчанию.Как я уже сказал, я использовал печатные заявления, и он печатает, что нынешняя комната - это зал. тогда, когда goRoom называется, он печатает новую комнату (скажем, государственную комнату). Но когда я пытаюсь нажать еще одну кнопку, она изменит новую комнату на стандартную. – shieldcy

+0

У вас есть проблема с затенением, проверьте обновление ... – MadProgrammer

+0

Большое вам спасибо. Мне потребовалось 5 дней, и я этого даже не заметил. – shieldcy

Смежные вопросы