2010-06-13 4 views
1

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

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

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"); 
     } 

    } 
+1

Я не думаю, что указанная вами строка может вызвать «NullPointerException». Можете ли вы опубликовать фактическую трассировку стека? –

+0

Запустили ли вы это через отладчик? Что такое имя файла и существует ли оно до того, как вы попытаетесь создать новый JLabel? –

+0

@ Мишель Мрозек: Да, ты прав. Когда я написал это, я торопился. XD ;; Когда я переместил строку «pane1.add (pokeLabel1)»; где я указал в строках комментариев, я получил исключение NullPointerException (вместо более разумного, как исключение, говорящее «НЕТ, ВЫ НЕ ДОЛЖНЫ ДОБАВЛЯТЬ ВОССТАНОВЛЕНИЕ ВО ВРЕМЯ RUNTIME»); исключение ссылается на эту строку и строку, которая вызывает функцию, в которой она находится, а затем остальное цитируется исходный код пакета. Код, который я упомянул в поле комментариев, по какой-то причине не вызывает ничего, что вызывает разочарование, когда я хочу, чтобы изображение менялось! – user365465

ответ

2

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

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

в

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

This стражников против вероятного нулевой указатели.

0

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

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