我目前有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);
}
答案 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);
}
}