Обръщането на картите за игра с карти с памет не работи в java (без аплети)

Правя игра с карта с памет. Започнах с добавяне на 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

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
Направи изключение: Изключение в основната нишка 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 Мисля, че трябва да публикувате актуализирания си код, ако все още имате проблеми. - 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