我正在尝试在java中创建一个类似于Minesweeper的JFrame应用程序,但规则/目标略有不同。
我创建了一个JButtons网格,12x12并且有一个JButton 2D数组。
我试图在点击按钮时更改按钮的图像(使其成为X或金块的图像)。如果每个按钮都有一个单独的名称,我知道如何做到这一点,但创建144个单独的按钮并为每个按钮命名似乎不合逻辑。
所以我需要做的是在该按钮的click事件上,更改/设置该按钮的图像,但在我的动作监听器中,我只能知道该按钮的特定数组坐标。 / p>
我的问题是如何更改该特定按钮的图像?或者如何获取按钮[?] [?]的值,以便我可以更改该按钮的图像?
谢谢!
public class GoldPanel extends JPanel{
ImageIcon xImage = new ImageIcon("x.png");
ImageIcon goldImage = new ImageIcon("");
losingButtonListener loseButton = new losingButtonListener();
winningButtonListener winButton = new winningButtonListener();
JButton[][] button = new JButton[12][12];
//creates the layout
GridLayout layout = new GridLayout(12,12);
Random myRand = new Random();
public GoldPanel(){
//creates panel for name/title/score/etc
JPanel titlePanel = new JPanel();
add(titlePanel);
JLabel title = new JLabel("Welcome to the Goldmine Game!");
titlePanel.add(title);
//creates panel for the game board
JPanel gamePanel = new JPanel();
add(gamePanel);
gamePanel.setLayout(layout);
for(int i=0;i<12;i++)
{
for(int j=0;j<12;j++)
{
button[i][j] = new JButton(" ");
gamePanel.add(button[i][j]);
button[i][j].addActionListener(loseButton);
}
}
button[0][0].addActionListener(winButton);
}//end constuctor
private class losingButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}//actionPerformed
}//buttonListener
private class winningButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("you win");
}//actionPerformed
}//winningButtonListener
}//end GoldPanel class
答案 0 :(得分:2)
如果查看ActionEvent Documentation Page,您会发现每个操作事件都是使用Object source
构建的。这意味着如果系统在按钮上单击一个按钮,则此按钮将作为源传递给ActionEvent
的构造函数。
因此,您实际上是通过将此对象强制转换为正确的类来获得正确的按钮。
[...]
public void actionPerformed(ActionEvent ae) {
JButton theRightButton = (JButton) ae.getSource();
// do stuff with the button...
}
[...]
答案 1 :(得分:0)
使用切换按钮
http://docs.oracle.com/javase/7/docs/api/javax/swing/JToggleButton.html
因此,swing会在按钮模型中跟踪状态。
扩展按钮以在构造函数中传递x,y coord并将它们存储为字段
将相同的事件监听器附加到所有按钮,将源代码转换为按钮类并检索已单击的按钮的x / y
即时更改已按下的图标或事件编号
如果要复制此规则,请致电单击所有相邻的空白字段,但请务必检查按下的状态,以便不要回退已处理的邻居。