简体   繁体   中英

Clicking the button to change the picture

I'm triyng to make a game like bejeweled or candy crush. I have created 64 buttons units 8x8. I want to change the image of buttons clicked. But i couldn't. I would be glad if you can help. Or how else can I do?

Edit: I'm so sorry. I couldn't explain my problem clearly. My problem, i want to change pictures of clicked two buttons. For example, i clicked buttons[5] and i clicked buttons[11]. Then icon of buttons[5] should be buttons[11] icon and icon of [11] should be buttons[5] icon.

public class butondeneme extends JFrame{

private JPanel grid;
private JFrame jr;

public butondeneme(){
    jr=new JFrame();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 640, 640);
    grid=new JPanel();
    grid.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    grid.setLayout(new GridLayout(8,8,5,5));

    JButton[] buttons = new JButton[64];


 //Creating random image for buttons

        for (int i = 0; i<buttons.length; i++) {

                Random r = new Random();
                int a = r.nextInt(9)+1;
                switch(a){
                case 1 : buttons[i]=new JButton(new ImageIcon("img//Cakal.png"));
                        break;
                case 2 : buttons[i]=new JButton(new ImageIcon("img//BugsBunny.png"));
                        break;
                case 3 : buttons[i]=new JButton(new ImageIcon("img//Pig.png"));
                        break;
                case 4 : buttons[i]=new JButton(new ImageIcon("img//Taz.png"));
                        break;
                case 5 : buttons[i]=new JButton(new ImageIcon("img//Sam.png"));
                        break;
                case 6 : buttons[i]=new JButton(new ImageIcon("img//DuffyDuck.png"));
                        break;
                case 7 : buttons[i]=new JButton(new ImageIcon("img//Tweety.png"));
                        break;
                case 8 : buttons[i]=new JButton(new ImageIcon("img//Slyvester.png"));
                        break;
                case 9 : buttons[i]=new JButton(new ImageIcon("img//RoadRunner.png"));
                        break;
                }

                //Adding number to find easily
                String comand=Integer.toString(i);

                            //Get ImageIcon name
                final String imgName=((ImageIcon)buttons[i].getIcon()).toString();



                buttons[i].addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e){




                        }
                    }
                });
                buttons[i].setActionCommand(comand);

                grid.add(buttons[i]);

          }



    add(grid);



}



public static void main(String[] args){
    butondeneme erdem=new butondeneme();
    erdem.setVisible(true);
}



   }

EDITED POST:

You simply needs to use a JButton.setIcon() method, to get the desired effect. Though might have to modify it to suite your needs, to let it work for your use case. Please have alook at this attached code example:

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;

public class ButtonIconExample {

    private JButton[] buttons = new JButton[64];
    //private Icon informationIcon = UIManager.getIcon("OptionPane.informationIcon");
    //private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
    private Icon[] icons = {UIManager.getIcon("OptionPane.informationIcon"),
                            UIManager.getIcon("OptionPane.errorIcon"),
                            UIManager.getIcon("OptionPane.warningIcon")};
    private int previousIndex;
    private Random random;

    private ActionListener buttonActions = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            JButton button = (JButton) ae.getSource();
            if (previousIndex == -1)
                previousIndex = Integer.parseInt(button.getActionCommand());
            else {
                Icon previousIcon = buttons[previousIndex].getIcon();
                Icon currentIcon = button.getIcon();
                buttons[previousIndex].setIcon(currentIcon);
                button.setIcon(previousIcon);
                previousIndex = -1;
            }
        }
    };

    public ButtonIconExample() {
        previousIndex = -1;
        random = new Random();
    }

    private void displayGUI() {
        JFrame frame = new JFrame("Button Icon Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new GridLayout(8, 8, 5, 5));
        for (int i = 0; i < buttons.length; i++) {
            buttons[i] = new JButton();
            buttons[i].setIcon(icons[random.nextInt(3)]);
            buttons[i].setActionCommand("" + i);
            buttons[i].addActionListener(buttonActions);
            contentPane.add(buttons[i]);
        }

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new ButtonIconExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

我认为您可以使用:

Button.setIcon(newImage);

I assume you are looking for a solution how to find which button fired ActionEvent ? If so, it can be done at the following way:

buttons[i].addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){

        JButton button = (JButton) e.getSource();
        button.setIcon(<your icon>);

    }
};

This should work

    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;

    import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class butondeneme extends JFrame{

    private JPanel grid;
    private JFrame jr;
    JButton[] buttons;

    public butondeneme(){


        jr=new JFrame();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 640, 640);
        grid=new JPanel();
        grid.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        grid.setLayout(new GridLayout(8,8,5,5));

        buttons = new JButton[64];


     //Creating random image for buttons

            for (int i = 0; i<buttons.length; i++) {

                    Random r = new Random();
                    int a = r.nextInt(9)+1;
                    switch(a){
                    case 1 : buttons[i]=new JButton(new ImageIcon("img//Cakal.png"));
                            break;
                    case 2 : buttons[i]=new JButton(new ImageIcon("img//BugsBunny.png"));
                            break;
                    case 3 : buttons[i]=new JButton(new ImageIcon("img//Pig.png"));
                            break;
                    case 4 : buttons[i]=new JButton(new ImageIcon("img//Taz.png"));
                            break;
                    case 5 : buttons[i]=new JButton(new ImageIcon("img//Sam.png"));
                            break;
                    case 6 : buttons[i]=new JButton(new ImageIcon("img//DuffyDuck.png"));
                            break;
                    case 7 : buttons[i]=new JButton(new ImageIcon("img//Tweety.png"));
                            break;
                    case 8 : buttons[i]=new JButton(new ImageIcon("img//Slyvester.png"));
                            break;
                    case 9 : buttons[i]=new JButton(new ImageIcon("img//RoadRunner.png"));
                            break;
                    }

                    //Adding number to find easily
                    String comand=Integer.toString(i);

                                //Get ImageIcon name
                    final String imgName=((ImageIcon)buttons[i].getIcon()).toString();

                    buttons[i].addActionListener(new ButtonListener(i));
                    add(grid);

                }

    }



    public static void main(String[] args){
        butondeneme erdem=new butondeneme();
        erdem.setVisible(true);
    }

    class ButtonListener implements ActionListener{

        int index;

        public ButtonListener(int index) {
            this.index=index;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            buttons[index].setIcon(new ImageIcon("new_icon.png"));
        }

    }

    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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