簡體   English   中英

JButton 數組 ActionListener

[英]JButton array ActionListener

簡而言之,我想將一堆JButton累積到一個數組中,並為該數組創建一個ActionListener類。

我正在嘗試創建一個計算器,所有帶編號的按鈕,例如“6”,都在一個JButton數組中,因為我想讓它把設置的數字輸入到一個臨時的 int 中,這樣創建起來會更容易一種方法,而不是 10 個。我還有 40 個其他按鈕,我想將相同的主體應用到不同的數組中,因此將它們放入幾個ActionListener方法中會更快更容易,其中按鈕數據實現到該方法。 這是我的代碼:

private JButton num0, num1, num2, num3, num4, num5, num6, num7, num8, num9;
private JButton numArray[] = {num0, num1, num2, num3, num4, num5, num6, num7, num8, num9};

        public GUI(){
          numArray.AddActionListener(new ActionListener(){
             public void actionPerformed(ActionEvent event){

             }
       });
  }

你可以考慮Newb Monad的提議。 但是,您可以對所有按鈕使用相同的偵聽器,如下例所示。

public static void main(String[] args) {

    ActionListener listener = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() instanceof JButton) {
                String text = ((JButton) e.getSource()).getText();
                JOptionPane.showMessageDialog(null, text);
            }
        }
    };

    JPanel panel = new JPanel(new GridLayout(4,3));

    JButton[] array = new JButton[10];
    for (int i = 0; i < array.length; i++) {
        array[i] = new JButton(String.valueOf(i));
        array[i].addActionListener(listener);
        panel.add(array[i]);
    }

    JOptionPane.showMessageDialog(null, panel);

}

對話

事件

你有正確的想法。 但是,數組對象沒有addActionListener()方法。 必須為每個JButton單獨添加一個動作偵聽器。 您可以為每個按鈕使用相同的偵聽器,但是您必須確定在actionPerformed()方法中單擊了哪個按鈕。 IMO,更簡潔的解決方案是為每個 JButton 分配一個單獨的偵聽器,因為這樣每個 ActionListener 都可以知道按下了哪個數字,而無需檢查事件源。 例如,您可以創建一個NumberButtonListener類,該類將int作為其構造函數的唯一參數。 然后,您可以在一個小循環中同時創建 JButton 和相應的NumberButtonListener

我在“連接四”游戲的二維按鈕陣列中遇到了類似的問題。 我能夠在 ActionListener 中使用 for 循環來測試我的哪些按鈕被按下了。 關鍵是修改我的按鈕類中的 toString() 方法以將數組元素作為字符串提供:

在 JPanel 類定義中:...

discs = new RoundButton[6][7]; //my 2D array

...

public class RoundButton extends JButton {
...
    public String toString() {
        return "discs["+i+"]["+j+"]";
    }
...
}

private class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event) {

    for (int i = 0; i < discs.length; i++){
        for (int j= 0; j < discs[i].length; j++){
            if (event.getSource() == discs[i][j]){
                discs[i][j].setIcon(yellowDisc); //my particular action for that button
            }                                       
        }

抱歉,這很混亂。 我以前從來沒有在這里發過帖子。

這似乎對我很有效。 我基本上循環遍歷所有按鈕,同時根據操作(e.getSource())檢查它。

public void actionPerformed(ActionEvent e){

    //loop through allbuttons to check if clicked
    for(int i = 0; i < buttonArr.length; i++){
        for(int j = 0; j < buttonArr[0].length; j++){
            if(e.getSource() == buttonArr[i][j]){
                //do stuff
            }
        }
    }
        
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM