2015-05-30 59 views
1

我有20個循環生成的JToggleButtons,我需要統計其中有多少個活動。如何捕獲一組循環生成的JToggleButtons的點擊量?

private void generarBotones(){  
    JToggleButton b; 
    this.panelCuerpo.setLayout(new GridLayout(4,5));   
    for(int i = 1; i<=20; i++){ 
     b = new JToggleButton(); 
     b.setText(String.valueOf(i)); 
     this.panelCuerpo.add(b); 
     b.addActionListener(new ActionListener() { 
      int clicks = 0; 
      @Override 
      public void actionPerformed(ActionEvent ae2){ 
       clicks = clicks + 1; 
       System.out.println(clicks); 
      }     
      public void setCantidadBoletas(int clicks){ 
       cantidadBoletas = clicks; 
      } 
     }); 
    } 
} 

這裏的問題是,它計算每次點擊的次數是多少,而不是計數有多少個被選中。

PS。我試圖使用(b.isSelected()),但b需要final來訪問它,所以它不是解決方案。

+0

如果你在循環中聲明你的JToggleButton,那麼它可能是最終的。但更好的是,只需使用JToggleButtons的ArrayList作爲字段並遍歷它即可。 –

回答

2

如果申報JToggleButton內循環,你可以把它final

for (int i = 1; i<=20; i++) { 
    JToggleButton b = new JToggleButton(); 

然後你可以使用b.isSelected

b.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      if (b.isSelected()) 
       clicks++; 
      else 
       clicks--; 
     } 
    }); 
} 

clicks必須是類變量。

+0

最簡單的答案。 –

1

創建一個類的屬性,將計算所選擇的切換:

private int selectedCount; 

初始化計數器爲0,在構造函數:

this.selectedCount = 0; 

遞增或每次遞減計數器切換的狀態更改:

b.addItemListener(new ItemListener() { 
    public void itemStateChanged(ItemEvent ev) { 
     if (ev.getStateChange() == ItemEvent.SELECTED){ 
      YourClass.this.selectedCount++; 
     } else if (ev.getStateChange() == ItemEvent.DESELECTED){ 
      YourClass.this.selectedCount--; 
     } 
     System.out.println(YourClass.this.selectedCount); 
    } 
}); 
1

意見建議:

  • 創建一個域,JToggleButton[] toggleButtons = new JToggleButton[20]
  • 或者使用ArrayList,如果你選擇
  • 在你的for循環創建JToggleButton中,並將其分配到正確的數組項。
  • 在ActionListener中,只需遍歷數組,計算選中的JToggleButton項的數量。
  • 你完成了。
1

有很多方法可以完成,最好的方法取決於您的其他代碼。我儘量保持與您的接近。

你可以只聲明按鈕爲final內循環,並保持按鈕選擇的數量,這將在ActionListener進行修改的一個全球性的計數:

public class ButtonsCount extends JFrame { 

    int clicks = 0; 

    ButtonsCount() { 

     JLabel label = new JLabel("0"); 
     JPanel buttonsPanel = new JPanel(new GridLayout(4,5)); 

     for(int i = 1; i <= 20; i++) { 
      final JToggleButton b = new JToggleButton(); 
      b.setText(String.valueOf(i)); 
      buttonsPanel.add(b); 
      b.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent ae2){ 
        if (b.isSelected()) 
         label.setText(String.valueOf(++clicks)); 
        else 
         label.setText(String.valueOf(--clicks)); 
       } 
      }); 
     } 

     add(buttonsPanel); 
     add(label, BorderLayout.PAGE_END); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     new ButtonsCount(); 
    } 
}