2012-11-08 43 views
0

在我的主要鞦韆架我有這樣的方法:搖擺的invokeLater()方法不工作

public void receiveCommand(String command) { 
    if (command.equals("enable")) { 
     Runnable enable = new Runnable() { 
      public void run() { 
       button1.setEnabled(true);      
       button1.revalidate(); 
       button1.repaint(); 
      }     
     }; 
     SwingUtilities.invokeLater(enable);    
    } 

基本上,我試圖更新GUI(啓用按鈕Button1的)從外面通過調用receiveCommand()方法。

但是,這不起作用,即button1仍然被禁用。我在這裏做錯了什麼?

編輯: 這裏是按鈕1聲明:

private javax.swing.JButton button1; 
button1.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N 
button1.setEnabled(false); 
button1.addActionListener(new java.awt.event.ActionListener() { 
public void actionPerformed(java.awt.event.ActionEvent evt) { 
      button1ActionPerformed(evt); 
     } 
    }); 

兩個按鈕1receiveCommand方法是在此遊戲類:

public class Game extends javax.swing.JFrame 

米ethod從另一個類叫做:

gameUI.receiveCommand("enable"); //gameUI is a Game object 

編輯2:感謝您對您的幫助!事實證明這是一個錯誤的參考,所以我所做的只是嘗試更新一個尚未設置可見的錯誤框架的GUI。傻我

+3

「不起作用」告訴我們一點。你能詳細說明嗎?給我們更多的信息繼續下去? –

+0

您確定'if'語句內的代碼塊正在執行嗎?也許嘗試'command.equalsIgnoreCase(「啓用」)'而不是? – MadProgrammer

+0

我忘了添加:button1仍然被禁用 – Chin

回答

1

因此無論如何,這工作。

public class TestInvokeLater { 

    public static void main(String[] args) { 
     new TestInvokeLater(); 
    } 

    public TestInvokeLater() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setBorder(new EmptyBorder(12, 12, 12, 12)); 
      final JButton runMe = new JButton("Run me"); 
      runMe.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        runMe.setEnabled(false); 
        new Thread(new Runnable() { 

         @Override 
         public void run() { 
          try { 
           Thread.sleep(1000); 
          } catch (InterruptedException ex) { 
          } 
          SwingUtilities.invokeLater(new Runnable() { 

           @Override 
           public void run() { 
            runMe.setEnabled(true); 
           } 
          }); 
         } 
        }).start(); 
       } 
      }); 
      setLayout(new GridBagLayout()); 
      add(runMe); 
     } 
    } 
} 
+1

爲什麼*嘗試無效和重新繪製它的容器,而不是*建議?應該不需要調用任何這些方法。 – Robin

+1

@Robin我同意,但我已經看到很多情況下,「這不應該做的事」通過這樣做來解決 – MadProgrammer

+0

可能是 - 但你的例子不是那些奇怪的角落案例之一...所以它是這可能導致無經驗的人走向錯誤的方向 – kleopatra