翻转存储卡游戏卡不适用于java(没有applet)

时间:2014-05-06 14:21:50

标签: java swing jlabel imageicon

我正在制作记忆卡游戏。我开始添加5个ImageIcons,其中卡的初始值(图像)处于翻转状态,添加了一个按钮,用于通过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

2 个答案:

答案 0 :(得分:4)

label1.setIcon(image1);中尝试label1 = new JLabel(image1);而不是EventClass。因为您使用新的JLabel创建了Icon的新实例,但未添加到JFrame

答案 1 :(得分:1)

扩展@ alex2410的答案,

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

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

这样:

label1 = new JLabel()为新创建的reference JLabel分配label1

add(label1) label1的值传递给add时。该值是您之前创建的reference的{​​{1}}。

在此之后将JLabel新对象分配给reference时,它不会更改最初传递到label1的对象。因此,您的屏幕不会改变。

当您致电add时,您对label1.setIcon(...)指向的对象进行了更改。此对象恰好与您添加到JFrame的对象相同,因此更改该对象将对屏幕进行更改。