2013-10-22 30 views
0

我有這個代碼片段(實際上是代碼的一部分),在一個類中,我有所有Jbutton爲26個字母創建的。我有另一個課程記錄時間,當時間結束或遊戲結束時,我想一次性禁用所有26個JButton。如何從Java swing中的另一個類中禁用一個類中的多個JButton?

這裏是代碼創建Jbuttons中

public class DetailsPanel extends JPanel { 



     public DetailsPanel() { 
      setLayout(new BorderLayout()); 
      setBorder(BorderFactory.createTitledBorder(" click here ")); 

      JPanel letterPanel = new JPanel(new GridLayout(0, 5)); 
      for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) { 
       String buttonText = String.valueOf(alphabet); 
       JButton letterButton = new JButton(buttonText); 
       letterButton.addActionListener(clickedbutton()); 
       letterPanel.add(letterButton, BorderLayout.CENTER); 
      } 
      add(letterPanel, BorderLayout.CENTER); 
     } 

     } 

在我maincontrol class,我要關掉所有的Jbuttons中像

public class maincontrol { 
    int counter; 
    DetailsPanel dp; 
    public maincontrol(DetailsPanel dp) { 
    this.dp = dp; 
    int counter = 0; 
} 

public void turnoff(){ 
    if (counter>10){ 
     //turn off all here// 
    } 
} 

} 
+4

爲什麼不乾脆把按鈕,或者更好的AbstractActions,集合中,並給它一個'的setEnabled (布爾啓用)'方法。在該方法中遍歷集合設置每個按鈕或Action的enabled屬性。 –

+0

對不起,我不明白你的意思 –

+1

只要把你的按鈕放在'ArrayList '。給持有這些按鈕的類和這個列表設置一個方法來設置按鈕的狀態。在該方法中遍歷列表。這只不過是Java的基本功能。當然你已經使用了數組列表,並通過for循環遍歷它們,對吧? –

回答

3

請您DetailsPanel參考。添加一個方法來禁用按鈕,例如:

public class DetailsPanel extends JPanel { 
    private final JPanel letterPanel; 
    public DetailsPanel() { 
     setLayout(new BorderLayout()); 
     setBorder(BorderFactory.createTitledBorder(" click here ")); 

     letterPanel = new JPanel(new GridLayout(0, 5)); 
     ... 
    } 
    public void disableButtons() { 
     for (Component c : letterPanel.getComponents()) { 
      if (c instanceof JButton) c.setEnabled(false); 
     } 
    } 
} 

當您要禁用按鈕時調用它。或者一些更聰明,做它的基礎上圈內部的數量,你在傳:

private static final int MAX_TURNS = 10; 
    public void updateButtons(int turn) { 
     for (Component c : letterPanel.getComponents()) { 
      if (c instanceof JButton) c.setEnabled(turn <= MAX_TURNS); 
     } 
    } 
+0

+1,for不使用List來存儲按鈕。您可以直接從容器中直接獲取按鈕。 – camickr

1

由於氣墊船完整的鰻魚已經建議,你可以簡單地把所有的按鈕簡單java.util.List某種並且簡單地遍歷列表,改變按鈕的狀態時,你需要...

例如...

public class DetailsPanel extends JPanel { 

    private List<JButton> buttons = new ArrayList<>(26); 

    public DetailsPanel() { 
     setLayout(new BorderLayout()); 
     setBorder(BorderFactory.createTitledBorder(" click here ")); 

     JPanel letterPanel = new JPanel(new GridLayout(0, 5)); 
     for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) { 
      String buttonText = String.valueOf(alphabet); 
      JButton letterButton = new JButton(buttonText); 
      buttons.add(letterButton); 
      letterButton.addActionListener(clickedbutton()); 
      letterPanel.add(letterButton, BorderLayout.CENTER); 
     } 
     add(letterPanel, BorderLayout.CENTER); 
    } 

    public void setEnabled(boolean enabled) { 
     super.setEnabled(enabled); 
     for (JButton btn : buttons) { 
      btn.setEnabled(enabled); 
     } 
    } 

} 

這意味着,當你想禁用按鈕,你可以簡單地做些...

// detailsPane is a reference to an instance of DetailsPane 
detailsPane.setEnabled(false); 

而且

// detailsPane is a reference to an instance of DetailsPane 
detailsPane.setEnabled(true); 

當你想使他們...

+0

爲什麼你有'super.setEnabled(啓用);'? –

+0

@ user1988876這是一項義務。如果我沒有記錯,'setEnabled'會觸發一個屬性更改事件,所以可能有系統的某些部分可能會對它作出響應。盲目忽視已實現的功能是破壞應用程序的一種可靠的方法;) – MadProgrammer

+0

'因此可能有系統的某些部分可能會對其進行響應'......您在這裏指的是什麼? –

相關問題