Java 多个可点击的JPanel

Java 多个可点击的JPanel,java,graphics,jpanel,Java,Graphics,Jpanel,我目前有108个自动生成的JPanel,每个都包含一个随机数。 是否有一种方法可以轻松地使每个按钮都可点击? 这是我的密码 创建JPanel: for (int row = 0; row < numbers.length; row++) { for (int col = 0; col < numbers[row].length; col++) { int tempNumber = (i

我目前有108个自动生成的JPanel,每个都包含一个随机数。 是否有一种方法可以轻松地使每个按钮都可点击? 这是我的密码

创建JPanel:

        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);
            }        
    }    

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

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

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

button.setBorderPainted( false );

因此,基本上,不用创建108个包含JLabel的面板,只需创建108个JButton并将按钮直接添加到父面板。

如果NumberPanel从JPanel扩展而来,则可以在构造函数中添加鼠标侦听器

addMouseListener(新的MouseListener(){ ....
});

首先,我认为您应该避免使用绝对位置布局(空布局)。正如您已经知道的行和列的数量一样,拥有GridLayout并不断添加相应的组件会更容易

另一方面,只需添加一个ActionListener,并使用事件中的getSource()获取所单击的内容。通过单击面板(或标签),您可以获取文本以了解其值

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

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

实际上,我更喜欢将所有内容解耦的想法,因此我只需发送一个FirePropertyChange并在需要处理值的任何位置接收它。

如果您想让可点击的
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);
}

}

我会做按钮。。但是,因为它们是通过循环创建的,我该如何进行鼠标单击呢?我已经说过,您将在按钮中添加一个
ActionListener
。您可以向每个按钮添加相同的ActionListener。在ActionListener代码中,您使用
ActionEvent
getSource()
方法来获取被单击的按钮,但是,它如何才能真正知道哪个按钮看起来不都是用相同的名称“np1”创建的呢?@Liam使用
getActionCommand
ActionEvent
传递到
actionPeformed
方法,或者将
ActionEvent
的源代码转换成
JButton
并使用
getText
。或者,您可以将按钮放置在数组或
列表中,并查找它们(将
ActionEvent
的源与列表中的元素进行比较)
,但它如何真正知道哪个按钮
——我已经说过
getSource()
方法将返回单击的按钮。您所需要做的就是将对象强制转换为JButton。ie.
JButton button=(JButton)event.getSource()
假设ActionListener已添加到JLabel中
-您无法将ActionListener添加到JLabel中<代码>只需添加一个ActionListener并使用事件中的getSource()
——正如已经建议的那样,尽管OP也需要为此使用JButton,以便您可以使用ActionListener。您是对的,如果他想使用JLabel,我想说的是MouseListener(MouseAdapter->MouseClicked)。谢谢你指出这一点。
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);
}