翻牌玩记忆卡游戏不是';t在java中工作(没有小程序)
我在做一个记忆卡游戏。我首先添加了5个图像图标,卡的初始值(图像)处于翻转状态,添加了一个按钮,用于通过Action Listener翻转卡,但当我单击按钮时,似乎无法将其翻转。 我还是GUI的初学者,我不想使用小程序翻牌玩记忆卡游戏不是';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
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)中删除,现在已经修复,谢谢。