多个可点击的JPanel

时间:2014-06-05 00:12:43

标签: java graphics jpanel

我目前有108个自动生成的jPanel,每个包含一个随机数。 有没有办法轻松地使每个可点击? 这是我的代码..

创建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);


}

4 个答案:

答案 0 :(得分:1)

为什么要创建包含JLabel的面板?为什么不直接将标签添加到父面板?

使用JLabel而不是使用JButton来显示随机数。然后,您可以为每个按钮添加ActionListener

您可以使用以下方式使按钮看起来像标签:

button.setBorderPainted( false );

基本上,不是创建包含JLabel的108个面板,而是创建108个JButton并将按钮直接添加到父面板。

答案 1 :(得分:1)

首先,我认为你应该避免使用绝对位置布局(空布局)。由于您已经知道行数和列数,因此更容易使用GridLayout并继续相应地添加组件。

另一方面,只需添加一个ActionListener并使用Event中的getSource()来获取被点击的内容。单击面板(或标签)后,您可以让Text知道其值是什么。

假设ActionListener已添加到JLabel,您可以执行以下操作:

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

我实际上更喜欢将所有内容解耦,所以我只需发送一个FirePropertyChange并在需要处理值的任何地方接收它。

答案 2 :(得分:0)

如果NumberPanel从JPanel扩展,则在构造函数中可以添加Mouse侦听器。

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

答案 3 :(得分:0)

如果您希望可点击的JPanel具有保存的“状态”,则可以使用JToggleButton

public class NumberButton extends JToggleButton {

public NumberButton(int randomNumber) {
    setBorder(BorderFactory.createEmptyBorder());
    String number = Integer.toString(randomNumber);
    setText(number);
    setFont(new Font("Serif", Font.BOLD, 35));
    setPreferredSize(new Dimension(40, 40));
    setBackground(Color.red);
}

}