-2
           for(i=0; i<16; i++){

                     images[i]=new ImageIcon(getClass()
    .getResource("/images/1 ("+i+").jpg"));

            }

 for( i=0; i<buttons.length; i++){
                for (j=0; j<buttons[i].length;j++){ 
                    n=i*buttons.length+buttons[i].length;
                    buttons[i][j]=new JButton();
                    label[n].setIcon((images[i*buttons.length+j]));
                    buttons[i][j].add(label[n]);
                    label[n].setVisible(false);


                    panel.add(buttons[i][j]);
                    buttons[i][j].addActionListener(this);

                }
            }




    public void actionPerformed(ActionEvent e) {
        if(e.getSource() instanceof JButton){
            JButton pressedButton = (JButton) e.getSource();
            opens[open]=(JButton) e.getSource(); //i want to put label[n] into array?
            if((pressedButton.getIcon() == null)){

                label[n].setVisible(true);

                open=open++;
            } else {   
                //pressedButton.setIcon(null);
            }

            }
        if (open==1){
            opens[0].setVisible(false);
            opens[1].setVisible(false);
        }
    }

你好朋友。我正在制作一个记忆游戏,如果按钮有相同的图标,它们将保持打开状态。

我在它的面板中制作了框架,在它的按钮中,每个按钮都有标签。如果 face 是 true 并且用户点击,他们将通过 setvisible(true) 打开

但是在执行无效操作时,我该怎么办label[n]? Not button[][]?

label[n].setIcon((images[i*buttons.length+j]));

我认为错误是那个。它不正确吗?因为它不执行。

建议后编辑:

 for(i=0; i<16; i++){

             images[i]=new ImageIcon(getClass().getResource("/images/1 ("+i+").jpg"));

    } //adding images to local variables

            for( i=0; i<buttons.length; i++){
                for (j=0; j<buttons[i].length;j++){ 
                    n=i*buttons.length+buttons[i].length;
                    buttons[i][j]=new JButton();
                //buttons[i][j].setIcon((images[i*buttons.length+j]));
    //if i make this code, all icons are displayed at first?

                    panel.add(buttons[i][j]);
                    buttons[i][j].addActionListener(this);

                }
            }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() instanceof JButton){
            JButton pressedButton = (JButton) e.getSource();
            if(pressedButton.getIcon() == null){
                pressedButton.setIcon((images[i*buttons.length+j]));
            } else {
                pressedButton.setIcon(null);
            }
        }
    }

我按照你的建议制作了这段代码。但现在图像不显示并且点击不起作用。

4

2 回答 2

2

我认为这篇文章与这个问题有关。也许是任务?

几个提示:

标签[n].setIcon((图像[i*buttons.length+j]));

images数组中有多少张图像?一个快速的数学运算会说,如果你有一个 4x4 数组,那么你将需要i*buttons.lenght+j == 4*4+4 == 20最后一次迭代的图像。i*j/2 == 8假设是一对配对游戏,您只需要图像。

如果按钮具有相同的图标,它们将保持打开状态。我在它的面板中制作了框架,在它的按钮中,每个按钮都有标签。

为什么需要标签?我认为如果两个按钮匹配,您可以禁用这些按钮,这样用户将无法再次单击它们并调度actionPerformed事件。

如果不是绝对需要使用数组,您可以改用ArrayList它并从其方法中受益。

更新

我发布此代码是因为我认为您仍然坚持使用数组。我只是想告诉你没有必要使用它们来保持引用,你只需要在对象范式下多想一点,并将这个任务委托给适当的对象。

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;


public class Demo {    
    /* 
     * This variable will point to a pressed button to keep reference.
     */
    JButton _alreadyPressedButton = null;

    /**
     * Initializes the GUI
     */
    private void initGUI(){
        /*
         * Create needed icons - As this example uses 6 buttons, then I need 3 icons 
         */
        ImageIcon icon1 = (ImageIcon) UIManager.getIcon("OptionPane.errorIcon");
        ImageIcon icon2 = (ImageIcon) UIManager.getIcon("OptionPane.informationIcon");
        ImageIcon icon3 = (ImageIcon) UIManager.getIcon("OptionPane.warningIcon");
        /*
         * Make a list with 6 icons (add each icon twice)
         */
        List<ImageIcon> iconsList = new ArrayList<>();
        iconsList.add(icon1);
        iconsList.add(icon1);
        iconsList.add(icon2);
        iconsList.add(icon2);
        iconsList.add(icon3);
        iconsList.add(icon3);
        Collections.shuffle(iconsList); /* Shuffle the list */

        ActionListener actionListener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                if(e.getSource() instanceof JButton){                    
                    final JButton pressedButton = (JButton) e.getSource();              
                    /* 
                     * Execute this code in a SwingWorker to prevent block EDT at "Thread.sleep(500)" line
                     * Google for EDT (Event Dispatch Thread)
                     */
                    SwingWorker sw = new SwingWorker() {
                        @Override
                        protected Object doInBackground() throws Exception {
                            if(_alreadyPressedButton != pressedButton){
                                pressedButton.setIcon(pressedButton.getPressedIcon());

                                if(_alreadyPressedButton != null){ 
                                    Thread.sleep(500);
                                    if(_alreadyPressedButton.getIcon() == pressedButton.getIcon()){
                                        _alreadyPressedButton.setEnabled(false);
                                        pressedButton.setEnabled(false);
                                    } else {
                                        _alreadyPressedButton.setIcon(null);
                                        pressedButton.setIcon(null);
                                    }
                                    _alreadyPressedButton = null;
                                } else {
                                    _alreadyPressedButton = pressedButton;
                                }

                            }
                            return null;
                        }

                    };

                    sw.execute();
                }
            }
        };

        JPanel panel = new JPanel(new GridLayout(3, 2));
        panel.setPreferredSize(new Dimension(200, 200));

        for(ImageIcon icon : iconsList){
            JButton button = new JButton();
            button.setPressedIcon(icon);
            button.addActionListener(actionListener);
            panel.add(button);
        }

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                 new Demo().initGUI();
            }
        });        

    }
}
于 2013-09-23T18:34:21.290 回答
1

您似乎正在将 JLabel 添加到 JButton?如果这实际上是您正在做的事情,请不要这样做。相反,当您希望显示或更改按钮显示的图像(如果有)时,为什么不简单地设置 JButton 的 ImageIcon。您只需通过myButton.setIcon(fooIcon).


编辑
您在评论中声明:

以及它将如何显示来自 jbutton 的图像并隐藏它?

您可以简单地交换图标。如果要显示图像,请通过 将其 ImageIcon 设置为 JButton 的图标setIcon(myIcon)。完成后,通过setIcon(otherIcon)或将其换出setIcon(null)

您提供的链接并未将 JLabels 放在您正在尝试执行的 JButtons 之上,这就是我告诉您此信息的原因。

于 2013-09-23T18:27:09.913 回答