现在已经坚持了一段时间并且在经过一些搜索之后想到并且没有找到我正在寻找的东西会询问是否有人能解决我的问题。目前,对于我正在研究的小型拼贴项目,我需要一个包含100个按钮的面板,但每个按钮必须有一个动作监听器。选中此动作侦听器时必须在网格中报告其编号并更改按钮的文本。
for (int i = 0; i < 100; ++i) //Sets buttons created
{
ArrayList<JButton> testButton = new ArrayList<JButton>(); //Button Text
PlayerGrid1.add( new JButton(" ? ") );
}
代码是我如何将按钮添加到ArrayList,但我遇到的问题是当我尝试添加动作侦听器时,它会抛出有关抽象按钮和其他问题的错误。
JPanel PlayerGrid1 = new JPanel();
PlayerGrid1.setBackground(Color.WHITE);
PlayerGrid1.setBounds(0, 0, 375, 400);
frmBattleships.getContentPane().add(PlayerGrid1);
PlayerGrid1.setLayout(new GridLayout(10, 10, 0, 0));
这是我存储按钮的网格。
如果有人知道我如何向ArrayList添加一个监听器,或者使用与我相同的方法链接到某个人的帖子,我们将不胜感激。也只是为了让任何人知道如果没有正确或错误设置请不要火焰我通常不会问很多堆栈溢出问题。感谢。
答案 0 :(得分:0)
在 for loop 之前定义地图而不是列表,如:
Map<String,JButton> buttonMap = new HashMap<String,JButton>();
之后你应该为 for循环中的每个按钮设置唯一的动作命令'i'可以用于此目的。
for (int i = 0; i < 100; ++i) //Sets buttons created
{
JButton button = new JButton();
button.setActionCommand(String.valueOf(i));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
buttonMap.get(e.getActionCommand()).setText("Whatever you want!");
}
});
buttonMap.put(String.valueOf(i), button);
PlayerGrid1.add(button);
}
答案 1 :(得分:0)
试试这个`
JFrame frmBattleships = new JFrame();
JPanel PlayerGrid1 = new JPanel();
PlayerGrid1.setBackground(Color.WHITE);
PlayerGrid1.setBounds(0, 0, 375, 400);
frmBattleships.getContentPane().add(PlayerGrid1);
PlayerGrid1.setLayout(new GridLayout(10, 10, 0, 0));
for (int i = 0; i < 100; ++i) // Sets buttons created
{
ArrayList<JButton> testButton = new ArrayList<JButton>(); // Button
JButton newButton = new JButton("" + i); // Text
newButton.setName("" + i);
newButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(((JButton) e.getSource()).getName());
}
});
PlayerGrid1.add(newButton);
}
frmBattleships.setVisible(true);
`