Java 多个可点击的JPanel
我目前有108个自动生成的JPanel,每个都包含一个随机数。 是否有一种方法可以轻松地使每个按钮都可点击? 这是我的密码 创建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
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);
}