Изменить JButton ImageIcon при нажатии

Я пытаюсь создать приложение JFrame на java, похожее на Minesweeper, но с немного другими правилами / целями.

Я создал сетку из JButton, 12x12, и у меня есть 2D-массив JButton.

Я пытаюсь изменить изображение кнопки при ее нажатии (сделать это крестиком или изображением золотого самородка). Я знаю, как это сделать, если бы у меня было индивидуальное имя для каждой кнопки, но мне кажется нелогичным создавать 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

person j_fulch    schedule 05.10.2014    source источник


Ответы (2)


Если вы посмотрите на страницу документации ActionEvent вы видите, что каждое событие действия конструируется с Object source. Это означает, что если система регистрирует нажатие кнопки, эта кнопка передается конструктору ActionEvent как источник.

Таким образом, вы действительно получаете нужную кнопку, передавая этот объект нужному классу.

[...]
public void actionPerformed(ActionEvent ae) {
    JButton theRightButton = (JButton) ae.getSource();
    // do stuff with the button...
}
[...]
person sxleixer    schedule 05.10.2014
comment
Вы также можете использовать свойство ActionEvent actionCommand, которое по умолчанию соответствует тексту кнопки или может быть установлено на самой кнопке, в качестве альтернативы слепому преобразованию или необходимости использовать _3 _... Вы также можете использовать Action, позволяя OP передать ссылку на объект, на который будет воздействовать действие ... - person MadProgrammer; 06.10.2014
comment
Это именно то, что мне нужно. Спасибо за помощь! - person j_fulch; 06.10.2014

Используйте кнопку переключения

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

Таким образом, Swing отслеживает состояние для вас в модели кнопки.

Расширьте кнопку, чтобы передать координаты x, y в конструктор и сохранить их как поле

Прикрепите один и тот же прослушиватель событий ко всем кнопкам, приведите источник к классу кнопки и получите x / y нажатой кнопки

Замените на лету нажатую иконку на мою или номер в случае

Вызовите щелчок для всех соседних пустых полей, если вы хотите воспроизвести это правило, но не забудьте проверить нажатое состояние, чтобы не возвращаться к уже обработанным соседям.

person Lorenzo Boccaccia    schedule 05.10.2014