翻牌玩记忆卡游戏不是';t在java中工作(没有小程序)

翻牌玩记忆卡游戏不是';t在java中工作(没有小程序),java,swing,jlabel,imageicon,Java,Swing,Jlabel,Imageicon,我在做一个记忆卡游戏。我首先添加了5个图像图标,卡的初始值(图像)处于翻转状态,添加了一个按钮,用于通过Action Listener翻转卡,但当我单击按钮时,似乎无法将其翻转。 我还是GUI的初学者,我不想使用小程序 import java.awt.*; import javax.swing.*; import javax.swing.JFrame; import java.awt.event.*; //this class gonna control the basic ops of th

我在做一个记忆卡游戏。我首先添加了5个图像图标,卡的初始值(图像)处于翻转状态,添加了一个按钮,用于通过Action Listener翻转卡,但当我单击按钮时,似乎无法将其翻转。 我还是GUI的初学者,我不想使用小程序

import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.*;

//this class gonna control the basic ops of the game
public class MemoControl extends JFrame{

    public JLabel label;
    public JButton button;

            //images
            public ImageIcon image1;
            public JLabel label1;
            public ImageIcon image2;
            public JLabel label2;
            public ImageIcon image3;
            public JLabel label3;
            public ImageIcon image4;
            public JLabel label4;
            public ImageIcon image5;
            public JLabel label5;

            public MemoControl(){

                    setLayout(new FlowLayout());

                    image1 = new      ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label1 = new JLabel(image1);
                    add(label1);

                    image2 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label2 = new JLabel(image2);
                    add(label2);

                    image3 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label3 = new JLabel(image3);
                    add(label3);

                    image4 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label4 = new JLabel(image4);
                    add(label4);

                    image5 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label5 = new JLabel(image5);
                    add(label5);


                    /*label = new JLabel("Welcome to AMY Memo Game");
                    add(label);*/

                    /*textField = new JTextField(15);
                    add(textField);*/

                    button = new JButton("Flip");
                    add(button);

                    EventClass event = new EventClass();
                    button.addActionListener(event);

                }//MyMemo constr end

                private class EventClass implements ActionListener{

                        public void actionPerformed(ActionEvent e){
                            if(e.getSource() == button){
                                image1 = new ImageIcon(getClass().getResource("deer_card.jpg"));
                                label1 = new JLabel(image1);}

                            }
                    }//Event class end

            public static void main(String args[]){

                    MemoControl gui = new MemoControl();

                    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    gui.pack();
                    gui.setVisible(true);
                    gui.setTitle("My Memo");

            }//main end

    }//AMYMemo class end
更新的代码:

import java.awt.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.*;

//this class gonna control the basic ops of the game
public class MemoControl extends JFrame{

    public JLabel label;
    public JButton button;

            //images
            public ImageIcon image1;
            public JLabel label1;
            public ImageIcon image2;
            public JLabel label2;
            public ImageIcon image3;
            public JLabel label3;
            public ImageIcon image4;
            public JLabel label4;
            public ImageIcon image5;
            public JLabel label5;

            public MemoControl(){

                    setLayout(new FlowLayout());

                    image1 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label1 = new JLabel(image1);
                    add(label1);

                    image2 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label2 = new JLabel(image2);
                    add(label2);

                    image3 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label3 = new JLabel(image3);
                    add(label3);

                    image4 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label4 = new JLabel(image4);
                    add(label4);

                    image5 = new ImageIcon(getClass().getResource("card_cover1.jpg"));
                    label5 = new JLabel(image5);
                    add(label5);


                    /*label = new JLabel("Welcome to AMY Memo Game");
                    add(label);*/

                    /*textField = new JTextField(15);
                    add(textField);*/

                    button = new JButton("Flip");
                    add(button);

                    EventClass event = new EventClass();
                    button.addActionListener(event);

                }//MyMemo constr end

                private class EventClass implements ActionListener{

                        public void actionPerformed(ActionEvent e){
                            if(e.getSource() == button){

                                image1 = new ImageIcon(getClass().getResource("deer_card.jpg"));
                                label1.setIcon(image1);
                                }

                            }
                    }//Event class end

            public static void main(String args[]){

                    MemoControl gui = new MemoControl();

                    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    gui.pack();
                    gui.setVisible(true);
                    gui.setTitle("My Memo");

            }//main end

    }//AMYMemo class end

尝试
label1.setIcon(image1)而不是
label1=新的JLabel(图像1)
EventClass
中。因为您使用新的
图标创建了
JLabel
的新实例,该图标未添加到
JFrame

中,请尝试
label1.setIcon(image1)而不是
label1=新的JLabel(图像1)
EventClass
中。因为您使用新的
图标创建了
JLabel
的新实例,该图标未添加到您的
JFrame

中,并在@alex2410的答案上展开

在java中,您需要理解变量、引用和对象之间的区别

label1
是一个变量。它是一个变量,可以保存对“JLabel”的引用。
newjlabel(..)
创建一个对象并向其返回一个
引用

因此:

label1=new JLabel()

当您
add(label1)
时,
label1
的值被传递到
add
。该值是对先前创建的
JLabel
引用

在此之后,如果将新对象的
引用
指定给
标签1
,则不会更改最初传递到
添加
中的对象。因此,您的屏幕不会改变


调用
label1.setIcon(…)
时,您会更改
label1
所指向的对象。该对象恰好与您添加到JFrame的对象相同,因此更改该对象将更改屏幕。

展开@alex2410的答案

在java中,您需要理解变量、引用和对象之间的区别

label1
是一个变量。它是一个变量,可以保存对“JLabel”的引用。
newjlabel(..)
创建一个对象并向其返回一个
引用

因此:

label1=new JLabel()

当您
add(label1)
时,
label1
的值被传递到
add
。该值是对先前创建的
JLabel
引用

在此之后,如果将新对象的
引用
指定给
标签1
,则不会更改最初传递到
添加
中的对象。因此,您的屏幕不会改变


调用
label1.setIcon(…)
时,您会更改
label1
所指向的对象。此对象恰好与添加到JFrame中的对象相同,因此更改该对象将对屏幕进行更改。

它发生异常:线程“main”java.lang.NullPointerException位于javax.swing.ImageIcon。(ImageIcon.java:205)位于MemoControl。(MemoControl.java:28)在MemoControl.main(MemoControl.java:75)中,仅在
EventClass
actionPerformed
方法中使用该行,在
MemoControl
构造函数中保持原样(
label1=newjlabel(image1);
).@user3345160如果您仍然有问题,我想您应该发布更新后的代码。@FortMax并且您仍然得到NullPointerException?@Cruncher抱歉,不知何故图像从“bin”文件夹(我使用eclipse)中删除了,现在已经修复了,谢谢。它出现了一个异常:线程“main”中的异常javax.swing.ImageIcon处的java.lang.NullPointerException。(ImageIcon.java:205)在MemoControl处。(MemoControl.java:28)在MemoControl.main(MemoControl.java:75)处仅在
EventClass
actionPerformed
方法中使用该行,在
MemoControl
构造函数中保持原样(
label1=new JLabel(image1);
).@user3345160如果您仍然有问题,我想您应该发布更新的代码。@FortMax并且您仍然收到NullPointerException?@Cruncher抱歉,不知何故这些图像已从“bin”文件夹(我正在使用eclipse)中删除,现在已经修复,谢谢。