2013-10-22 81 views
0
public class ButtonGrid extends JFrame{ 


private final JButton[][] grid; 
private int length,width; 

public ButtonGrid(int width,int length){ 

    JPanel panel = new JPanel(); 
    JButton start = new JButton("Start"); 
    JButton reset = new JButton("Reset"); 
    panel.add(start); 
    //start.addActionListener(this); 
    panel.add(reset); 

    add(panel,BorderLayout.PAGE_START); 
    JPanel panel1 = new JPanel(); 
    panel1.setLayout(new GridLayout(width,length)); 
    grid = new JButton[width][length]; 

    for(int y=0; y<length; y++){ 
     for(int x=0; x<width; x++){ 
      grid[x][y]=new JButton(); 
      grid[x][y].setBackground(Color.WHITE); 
      panel1.add(grid[x][y]); 
      grid[x][y].addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        Object source = e.getSource(); 
        JButton b1 = (JButton)source; 
        if(b1 == source){ 
        b1.setBackground(Color.BLACK); 
        } 
       } 
      }); 
      reset.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        Object source = e.getSource(); 
        JButton b1 = (JButton)source; 
        if(b1 == source){ 
        b1.setBackground(Color.WHITE); 
       } 
       } 
      }); 
      } 
    } 


    add(panel1,BorderLayout.CENTER); 
    panel1.setBackground(Color.RED); 

    setSize(600,600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
} 
     public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
    public void run() { 
    ButtonGrid bg = new ButtonGrid(25,25); 
     } 
    }); 
    } 
} 

電網在這段代碼中,我能夠改變在網格中的按鍵背景,但我想通過再次改變背景,以白色網格復位。我無法做到這一點,因爲我的actionListener不允許使用grid [x] [y]設置背景。請幫助我如何繼續。我想重置通過復位按鈕

+0

重置按鈕應該做什麼?重置*全部*按鈕? – Holger

+0

注意:'if(b1 == source)'檢查是不必要的。你的'ActionListener'只會被你註冊它的按鈕調用,沒有別的。 – Holger

+0

更重要的是你要添加actionlistener來重置for循環。對我來說這似乎是無稽之談。你的'grid []] []'是在類上下文中聲明的。當然你可以從任何成員方法或嵌套類訪問它。 – Sage

回答

1

我不能這樣做,因爲我的actionListener不允許使用grid [x] [y]設置背景。

當然你可以做到這一點。 grid變量是一個實例變量,因此您可以直接在ActionListener中訪問它。因此,在你的ActionListener代碼將是一個循環,通過你的陣列的兩個維度,然後遍歷設置每個按鈕的背景

for(int y=0; y<length; y++){ 
     for(int x=0; x<width; x++){ 
      grid[x][y].setBackground(Color.WHITE); 
     } 
} 

而且,你不應該創建每個按鈕單獨的ActionListener。

ActionListener black = new ActionListener() 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     Object source = e.getSource(); 
     JButton b1 = (JButton)source; 
     b1.setBackground(Color.BLACK); 
    } 
}; 

for(int y=0; y<length; y++){ 
     for(int x=0; x<width; x++){ 
      grid[x][y]=new JButton(); 
      grid[x][y].setBackground(Color.WHITE); 
      panel1.add(grid[x][y]); 
      grid[x][y].addActionListener(black); 
     } 
} 
0

注意的ActionListener將只會收到在其被註冊的按鈕調用:你可以像代碼共享的監聽器。所以你不必比較事件的來源。

for(int y=0; y<length; y++){ 
    for(int x=0; x<width; x++){ 
     final JButton b=new JButton(); 
     grid[x][y]=b; 
     b.setBackground(Color.WHITE); 
     panel1.add(b); 
     b.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       b.setBackground(Color.BLACK); 
      } 
     }); 
     reset.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       b.setBackground(Color.WHITE); 
      } 
     }); 
    } 
} 

或者,也可以使用一個聽者設定的背景和一個復位監聽器,迭代:

下面的代碼將通過註冊多個ActionListener S的被點擊復位按鈕,當所有調用重置所有按鈕在所有按鈕上:

ActionListener black=new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     ((JButton)e.getSource()).setBackground(Color.BLACK); 
    } 
}; 
for(int y=0; y<length; y++){ 
    for(int x=0; x<width; x++){ 
     final JButton b=new JButton(); 
     grid[x][y]=b; 
     b.setBackground(Color.WHITE); 
     panel1.add(b); 
     b.addActionListener(black); 
    } 
} 
reset.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     for(JButton[] buttons:grid) 
      for(JButton b:buttons) 
       b.setBackground(Color.WHITE); 
    } 
});