Переворачивание карт для игры с картами памяти не работает в java (без апплетов)

Я делаю карточную игру памяти. Я начал с добавления 5 ImageIcons с начальным значением (изображениями) карты в перевернутом состоянии, добавил кнопку для переворачивания карт через прослушиватель действий, но, похоже, не могу перевернуть ее, когда я нажимаю кнопку. Я все еще новичок в графическом интерфейсе и не хочу использовать апплеты.

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

person FortMax    schedule 06.05.2014    source источник


Ответы (2)


Попробуйте label1.setIcon(image1); вместо label1 = new JLabel(image1); в EventClass. Поскольку вы создаете новый экземпляр JLabel с новым Icon, который не добавляется к вашему JFrame.

person alex2410    schedule 06.05.2014
comment
Он сделал исключение: исключение в потоке main java.lang.NullPointerException в javax.swing.ImageIcon.‹init›(ImageIcon.java:205) в MemoControl.‹init›(MemoControl.java:28) в MemoControl.main(MemoControl .java:75) - person FortMax; 06.05.2014
comment
используйте эту строку только в методе EventClass actionPerformed, в конструкторе MemoControl оставьте как есть (label1 = new JLabel(image1);). - person alex2410; 06.05.2014
comment
@user3345160 user3345160 Я думаю, вам следует опубликовать обновленный код, если у вас все еще есть проблемы. - person Cruncher; 06.05.2014
comment
@FortMax И вы все еще получаете исключение NullPointerException? - person Cruncher; 06.05.2014
comment
@Cruncher да, я все еще понимаю. - person FortMax; 06.05.2014
comment
@Cruncher Извините, каким-то образом изображения были удалены из папки «bin» (я использую eclipse), теперь это исправлено, спасибо. - person FortMax; 07.05.2014

Расширяя ответ @ alex2410,

В Java вам нужно понимать разницу между переменной, ссылкой и объектом.

label1 — это переменная. Это переменная, которая может содержать ссылку на "JLabel". new JLabel(..) создает объект и возвращает ему reference.

so:

label1 = new JLabel() назначает reference вновь созданным JLabel по label1.

Когда вы add(label1), значение label1 передается в add. Значение представляет собой reference для JLabel, которое вы создали ранее.

Когда после этого вы присваиваете reference нового объекта label1, он не изменяет объект, который изначально был передан в add. Таким образом, ваш экран не изменится.

Когда вы вызываете label1.setIcon(...), вы вносите изменения в объект, на который указывает label1. Этот объект оказался тем же самым, который вы добавили в JFrame, поэтому изменение этого объекта приведет к изменению экрана.

person Cruncher    schedule 06.05.2014