Как изменить значение JLabel во время выполнения? - PullRequest
1 голос
/ 13 июня 2010

Я хочу изменить изображение, которое JLabel просматривает во время выполнения, но я получаю исключения NullPointerException, или ничего не происходит, когда я нажимаю волшебную кнопку, которая должна что-то делать. Возможно ли это даже на Java?

Вот мой код целиком:

    import java.text.*;
    import javax.swing.text.*;
    import java.util.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;

    public class Shell implements ActionListener, MenuKeyListener
    {
        JFrame frame;
        JWindow window;
        JButton PSubmit;
        JPanel pane1, pane2;
        JRadioButton R1, R2, R3;
            ButtonGroup PGroup;
        JTabbedPane layout;

        String result;
        String border = "Border.png";
        String DF = "Frame.png";
        String list [];
        Driver driver;

        public Shell()
        {
            driver = new Driver();
            list = new String [6];
        }

        public void setFrame()
        {
            frame = new JFrame("Pokemon Program 3 by Systems Ready");
            frame.setSize(600, 600);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
            frame.getContentPane().setLayout(new BorderLayout());
        }
        public void frameLayout()
        {
            layout = new JTabbedPane();
            JPanel pane1 = new JPanel();
            JPanel pane2 = new JPanel();
            JLabel label = new JLabel("Please choose the restrictions:");
            JLabel imgLabel1 = new JLabel(new ImageIcon(border));
            JLabel notiLabel1 = new JLabel("The Pokemon chosen with these restrictions are:       ");
            JLabel notiLabel2 = new JLabel("'No Restrictions': No restrictions for the kind of Pokemon chosen based on species or items.");
            JLabel notiLabel3 = new JLabel("'Battle Revolution': All Pokemon must have unique items.");
            JLabel notiLabel4 = new JLabel("'Battle Tower': All Pokemon must have unique items, Uber and Event Legendaries banned.");
            JLabel label2 = new JLabel("Please choose possible Pokemon:");
            pane1.add(label);
            pearlButtons();
            pane1.add(R1);
            pane1.add(R2);
            pane1.add(R3);
            pane1.add(PSubmit);
            pane1.add(notiLabel2);
            pane1.add(notiLabel3);
            pane1.add(notiLabel4);
            pane1.add(imgLabel1);
            pane1.add(notiLabel1);
            JLabel pokeLabel1 = new JLabel(new ImageIcon(DF));
            JLabel pokeLabel2 = new JLabel(new ImageIcon(DF));
            JLabel pokeLabel3 = new JLabel(new ImageIcon(DF));
            JLabel pokeLabel4 = new JLabel(new ImageIcon(DF));
            JLabel pokeLabel5 = new JLabel(new ImageIcon(DF));
            JLabel pokeLabel6 = new JLabel(new ImageIcon(DF));
            pane1.add(pokeLabel1);
            pane1.add(pokeLabel2);
            pane1.add(pokeLabel3);
            pane1.add(pokeLabel4);
            pane1.add(pokeLabel5);
            pane1.add(pokeLabel6);
            pane2.add(label2);
            layout.add("Pearl Version", pane1);
            layout.add("SoulSilver Version", pane2);
            frame.add(layout);
        }
        public void pearlButtons()
        {
            PGroup = new ButtonGroup();
            R1 = new JRadioButton("No Restrictions", true);
            R1.setActionCommand("N");
            R1.setVisible(true);
            R2 = new JRadioButton("Battle Revolution");
            R2.setActionCommand("BR");
            R2.setVisible(true);
            R3 = new JRadioButton("Battle Tower");
            R3.setActionCommand("B");
            R3.setVisible(true);
            PGroup.add(R1);
            PGroup.add(R2);
            PGroup.add(R3);
            PSubmit = new JButton("Submit");
            PSubmit.setActionCommand("pstart");
            PSubmit.setVisible(true);
            PSubmit.addActionListener(this);
        }
        public void pearlProcessing()
        {
                    //The "list" array has a bunch of string names that get .png affixed to them (and I named the image files as such when I name them)
            String file1 = list[0] + ".png";
            String file2 = list[1] + ".png";
            String file3 = list[2] + ".png";
            String file4 = list[3] + ".png";
            String file5 = list[4] + ".png";
            String file6 = list[5] + ".png";
    /*-------------------------------------------------------------------------------//
                    This is where the method's supposed to go to change the image...
                    I've tried pokeLabel = new JLabel(new ImageIcon(file1));, but that yields a NullPointerException.
//-----------------------------------------------------------------------------------*/
        }
        public static void main(String[] args)
        {
            Shell test = new Shell();
            test.setFrame();
            test.frameLayout();
            test.frame.setVisible(true); 
        }
        public void actionPerformed(ActionEvent e)
        {
            if ("pstart".equals(e.getActionCommand()))
            {
                result = PGroup.getSelection().getActionCommand();
                if (result.equals("N"))
                {
                    list = driver.Prandom();
                    pearlProcessing();
                }
                else
                    System.out.println("Not done yet! ;)");
            }
        } 

        public void menuKeyPressed(MenuKeyEvent e)  
        {
            System.out.println("pressed");
        }
        public void menuKeyReleased(MenuKeyEvent e)
        {
            System.out.println("menuKeyReleased");
        }
        public void menuKeyTyped(MenuKeyEvent e)
        {
            System.out.println("menuKeyTyped");
        }

    }

Ответы [ 2 ]

2 голосов
/ 13 июня 2010

Не зная, является ли это причиной, я бы изменил

 result = PGroup.getSelection().getActionCommand();
 if (result.equals("N")) {

на

 ButtonModel selection = PGroup.getSelection();
 result = (selection==null ? null : selection.getActionCommand()); 
 if ("N".equals(result)) {
 // etc...

Это защищает от вероятных нулевых указателей.

0 голосов
/ 15 июня 2010

Я настоятельно рекомендую всякий раз, когда вы получаете какое-либо исключение для всегда , посмотрите на трассировку стека и посмотрите, где была действительная строка, в которой произошло исключение.

Но если бы я предположил, вывызовите PGroup.getSelection() в вашем actionPerformed методе.Этот метод может вернуть null, если в вашей группе переключателей не выбрана ни одна кнопка.Я также заметил, что вы не устанавливаете изначально выбранную радиокнопку (вызов setSelected(true) на радиокнопке).Таким образом, если выбранная радио-кнопка null, вызов getActionCommand приведет к NullPointerException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...