2014-06-05 38 views
0

我目前有108個自動生成的jPanels,每個包含一個隨機數。 有沒有一種方法可以輕鬆地使每個這些可點擊? 這裏是我的代碼..多個可點擊的JPanels

創建JPanels:

 for (int row = 0; row < numbers.length; row++) 
    { 
     for (int col = 0; col < numbers[row].length; col++) 
      { 
       int tempNumber = (int)(Math.random() * 9 + 1); 
       numbers[row][col] = tempNumber; 
       np1 = new NumberPanel(tempNumber); 
       np1.setLocation(row*np1.getWidth(), row*getWidth()); 
       add(np1); 
      }   
    }  

人數面板類:

 public NumberPanel(int randomNumber) 
{ 
    String number = Integer.toString(randomNumber); 
    setPreferredSize(new Dimension(40, 40)); 
    setBackground(Color.red); 
    JLabel label = new JLabel(number, JLabel.LEFT); 
    label.setFont(new Font("Serif", Font.BOLD, 35)); 
    add(label); 


} 

回答

1

你爲什麼要創建一個面板包含一個JLabel?爲什麼不直接將標籤添加到父面板?

而不是使用JLabel顯示隨機數使用JButton。然後,您可以爲每個按鈕添加一個ActionListener

可以使按鈕看起來像一個標籤使用:

button.setBorderPainted(false); 

所以基本上,而不是創建包含一個JLabel 108分的面板,您只需創建108個Jbutton將和直接添加的按鈕父面板。

+0

我可以做按鈕..但是因爲它們是通過一個循環創建的,我將如何去點擊鼠標? – Liam

+0

我已經說過,你會添加一個'ActionListener'到按鈕。您可以將相同的ActionListener添加到每個按鈕。在ActionListener代碼中,您使用'ActionEvent'的'getSource()'方法來獲取被點擊的按鈕。 – camickr

+0

我明白了,但是它怎樣才能真正知道哪個按鈕看起來不會全部用相同的名稱'np1'創建? – Liam

0

如果NumberPanel從JPanel擴展,則在構造函數內部可以添加Mouse偵聽器。

addMouseListener(new MouseListener(){ .... });

1

首先,我認爲你應該避免使用絕對位置佈局(null layout)。由於您已經知道行數和列數,因此擁有GridLayout並相應添加組件會更容易。

另一方面,只需添加一個ActionListener並使用事件中的getSource()來獲取被點擊的內容。點擊面板(或標籤)後,您可以獲得文本以瞭解它的價值。

假設的ActionListener添加到JLabel的,你可以這樣做:

if (evt.getSource() instanceof JLabel) { 
    Integer value = Integer.valueOf(((JLabel) evt.getSource()).getText()); 
} 

其實我喜歡更多的想法都有了解耦,所以我就派中的firePropertyChange和接收它,無論我需要處理價值。

+1

'假設ActionListener被添加到JLabel中 - 您不能將ActionListener添加到JLabel。'只需添加一個ActionListener並使用Event'中的getSource() - 就像已經提出的那樣,儘管OP也需要爲此使用JButton,因此您可以使用ActionListener。 – camickr

+0

你說得對,我打算說MouseListener(MouseAdapter-> MouseClicked),如果它的情況下他想使用JLabel的話。 thx指出這一點。 – JDDelgado