繁体   English   中英

单击更改JButton ImageIcon

[英]Change JButton ImageIcon on Click

我试图在Java中创建一个与Minesweeper相似但规则/目标稍有不同的JFrame应用程序。

我创建了一个12x12的JButtons网格,并具有JButton 2D数组。

我试图更改单击按钮时的图像(使其成为X或金块的图像)。 如果每个按钮都有一个单独的名称,我知道该怎么做,但是创建144个单独的按钮并命名每个按钮似乎不合逻辑。

因此,我需要做的是在该按钮的click事件上,更改/设置该按钮的图像,但是在我的动作侦听器中,如果我知道该按钮的特定数组坐标,就只能弄清楚它。

我的问题是如何更改特定按钮的图像? 或者如何获取按钮[?] [?]的值,以便可以更改该按钮的图像?

谢谢!

 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

如果查看ActionEvent文档页面,则会看到每个动作事件都是使用Object source构造的。 这意味着,如果系统注册了对按钮的单击,则此按钮将作为传递给ActionEvent的构造函数。

因此,实际上,您可以通过将该对象强制转换为正确的类来获得正确的按钮。

[...]
public void actionPerformed(ActionEvent ae) {
    JButton theRightButton = (JButton) ae.getSource();
    // do stuff with the button...
}
[...]

使用切换按钮

http://docs.oracle.com/javase/7/docs/api/javax/swing/JToggleButton.html

因此,swing在按钮模型中为您跟踪状态。

扩展按钮以在构造函数中传递x,y坐标并将其存储为字段

将相同的事件侦听器附加到所有按钮,将源强制转换为按钮类,并检索已单击的按钮的x / y

快速更改按下的图标以挖掘事件中的数字或编号

如果要复制此规则,请单击click到所有相邻的空字段,但是请确保检查按下状态,以免回退已处理的邻居。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM