2014-10-05 86 views
0

我正在尝试在java中创建类似于扫雷的JFrame应用程序,但规则和目标略有不同。点击更改JButton ImageIcon

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

我试图改变一个按钮的图像,当它被点击(使它成为X或金块的图像)。我知道如何做到这一点,如果我有每个按钮的单独名称,但创建144个单独的按钮并命名每个按钮似乎不合逻辑。因此,我需要做的是在该按钮的单击事件上,更改/设置该按钮的图像,但在我的动作侦听器中,只有知道该按钮的特定数组坐标时,我才能算出它。

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

谢谢!

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 

回答

2

如果你看看你ActionEvent Documentation Page看到,每一个动作事件构造有Object source。这意味着如果系统在按钮上注册点击,该按钮将被传递给ActionEvent的构造函数,如

所以你实际上通过将这个对象转换为正确的类来获得正确的按钮。

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

您也可以使用ActionEvent的actionCommand属性,该属性默认为按钮的文本,或者可以在按钮本身上设置,作为盲转换或不得不使用'instanceof'的替代方法。 。你也可以使用一个'Action',允许OP传递一个被动作影响的对象的引用。 – MadProgrammer 2014-10-05 21:08:25

+0

这正是我所需要的。感谢您的帮助! – user2788749 2014-10-05 21:17:54

0

使用切换按钮

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

所以摆动跟踪状态,为您的按钮模型。

扩展按钮以通过X,Y坐标在构造,并将它们存储作为场

附加相同的事件侦听器,以所有的按钮,投源按钮类和检索的被点击的按钮具有的x/y

动态更改的按下图标到矿山或数在事件

呼叫点击所有相邻的空字段,如果你想复制这条规则,但要确保让你不检查按下状态循环回已处理的邻居。