2016-10-05 3 views
1

Я пытаюсь добавить кнопки над изображениями на панелях. Я также пытаюсь переключаться между панелями. Программа работает, но когда я нажимаю кнопку «инструкции», она дает огромный список ошибок в cmd. В чем проблема?Обмен между панелями

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
public class htw10 extends JFrame 
{ 
    final JFrame f=new JFrame("Hunt The Wumpus"); 
    private static final String FIRST_PANEL="first panel"; 
    private static final String SECOND_PANEL="second panel"; 
    private CardLayout cardLayout=new CardLayout(); 
    private JPanel content; 

    public void start() 
    { 

     // Create a new panel, make 'content' refer to it 
    content = new JPanel(); 

    // Set the content pane of the window to the panel we just created 
    f.setContentPane(content); 

    // Create a button group and some buttons 


    // Set the layout of the content panel and add buttons 
    content.setLayout(new FlowLayout()); 

    // Create and add the intro panel and instruction panel to the content panel 
    content.add(introPanel(),FIRST_PANEL); 
    content.add(instructionPanel(),SECOND_PANEL); 

    f.setSize(750,500); 
    f.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    f.setVisible(true); 


} 


    private JPanel instructionPanel() 
     { 
      JPanel secondPanel=new JPanel(); 
      ImageIcon icon=new ImageIcon("img2.jpg"); 
      JLabel pic2 = new JLabel(icon); 
      secondPanel.add(pic2); 
     JButton b1=new JButton("Back"); 
     content.add(b1); 
     b1.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        cardLayout.show(content,FIRST_PANEL); 
       } 
      }); 
     secondPanel.repaint(); 
      return secondPanel; 
     } 
     public JPanel introPanel() 
    { 
      JPanel iPanel=new JPanel(); 
     ImageIcon icon=new ImageIcon("img1.jpg"); 
      JLabel picLabel = new JLabel(icon); 
      iPanel.add(picLabel); 

     ButtonGroup group=new ButtonGroup(); 
      JButton b1=new JButton("Instructions"); 
      JButton b2=new JButton("Play"); 
      JButton b3=new JButton("Exit"); 
     picLabel.add(b1); 
     //f.getContentPane().add(picLabel,BorderLayout.SOUTH); 
     content.add(b1); 
      content.add(b2); 
      content.add(b3); 
     // Add a listener to the 'Instructions' button 
      // so that the cardLayout is shown when the button is clicked 
     b1.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        cardLayout.show(content,SECOND_PANEL); 
       } 
      }); 
     iPanel.repaint(); 
      return iPanel; 
    } 
    public static void main(String args[])throws Exception 
    { 
     htw10 obj=new htw10(); 
     obj.start(); 
    } 

} 
+0

Внимательно посмотрите на трассировку стека «NullPointerException». Он точно указывает, где именно в вашем коде происходит исключение. Перейдите к этой строке кода и выясните, что такое «null». Обратите внимание, что вы получаете «NullPointerException», если пытаетесь вызвать метод для переменной, которая является «null». – Jesper

+0

'C: \ JSDK> Java htw10 Исключение в потоке "главный" java.lang.NullPointerException в htw10.start (htw10.java:25) в htw10.main (htw10.java:69)' я являюсь не удалось найти ничего null ... –

+0

Если строка 25 является строкой: 'content.setLayout (new FlowLayout());' то это означает, что 'content' является' null'. Теперь вам нужно выяснить, почему. – Jesper

ответ

0

В строке 14, вы объявляете переменную-член content, но не инициализирует его. Переменные-члены будут автоматически инициализируются null, если вы не инициализировать их самостоятельно:

private JPanel content; // is automatically set to null 

В строке 25 вы вызываете метод setLayout на content:

content.setLayout(new FlowLayout()); 

Это вызовет NullPointerException потому что content является null.

Чтобы узнать больше о том, какой NullPointerException и почему это происходит, см: What is a NullPointerException, and how do I fix it?

Вам нужно установить content к чему-то. Похоже, что это должно относиться к области содержимого. Кроме того, вы вызываете метод introPanel() несколько раз, вызывая создание нескольких экземпляров этой панели. Это не то, что вы хотите. Эта панель должна быть создана только один раз, а затем вы должны использовать ее. Не звоните introPanel() несколько раз. Ваш метод start() должен выглядеть примерно так:

public void start() 
{ 
    // Create a new panel, make 'content' refer to it 
    content = new JPanel(); 

    // Set the content pane of the window to the panel we just created 
    f.setContentPane(content); 

    // Create a button group and some buttons 
    ButtonGroup group=new ButtonGroup(); 
    JButton b1=new JButton("Instructions"); 
    JButton b2=new JButton("Play"); 
    JButton b3=new JButton("Exit"); 

    // Set the layout of the content panel and add buttons 
    content.setLayout(new FlowLayout()); 
    content.add(b1); 
    content.add(b2); 
    content.add(b3); 

    // Create and add the intro panel and instruction panel to the content panel 
    content.add(introPanel(),FIRST_PANEL); 
    content.add(instructionPanel(),SECOND_PANEL); 

    f.setSize(750,360); 
    f.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    f.setVisible(true); 

    // Add a listener to the 'Instructions' button 
    // so that the cardLayout is shown when the button is clicked 
    b1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      cardLayout.show(content,SECOND_PANEL); 
     } 
    }); 
} 
+0

ваше предложение сработало ..... но теперь я хочу поместить кнопки над изображением в introPanel() .... я немного изменил код .... но либо кнопки идут рядом с изображением, либо они исчезают .... –

+0

'public JPanel introPanel() \t { \t \t JPanel iPanel = новый JPanel(); \t \t ImageIcon icon = новый ImageIcon ("img1.jpg"); \t \t JLabel picLabel = новый JLabel (значок); \t \t iPanel.add (picLabel); \t \t \t \t ButtonGroup group = new ButtonGroup(); \t \t JButton b1 = новый JButton («Инструкции»); \t \t JButton b2 = новый JButton («Play»); \t \t JButton b3 = новый JButton («Выход»); \t \t picLabel.add (b1); \t \t iPanel.repaint(); \t \t возвращение iPanel; \t} ' –

0

Я не думаю, что у Jpanel есть метод drawImage, который вы пытаетесь вызвать в нижнем коде.

public JPanel introPanel() 
{ 
    JPanel iPanel=new JPanel(); 
    ImageIcon icon=new ImageIcon("img1.jpg"); 
    iPanel.drawImage(icon, 0, 0,getWidth(),getHeight(),this); 
    return iPanel; 
} 

Вам нужен объект графика (java.awt.Graphics) для вызова drawImage метода.

Больше-над, вы можете попробовать другие методы, как

public JPanel introPanel() 
{ 
    JPanel iPanel=new JPanel(); 
    ImageIcon icon=new ImageIcon("img1.jpg"); 
    JLabel picLabel = new JLabel(icon); 
    iPanel.add(picLabel); 
    iPanel.repaint(); 
    return iPanel; 
} 
+0

эй ваш ответ сработал .... но теперь он дает ошибку времени выполнения ...... c: \ jsdk> javac htw10.java C: \ JSDK> Java htw10 Исключение в потоке "основного" java.lang.NullPointerException на htw10.start (htw10.java:25) на htw10.main (htw10.java:70) –

+0

это путь img1 .jpg правильно? – WitVault

+0

Я ...программа и файлы изображений хранятся в одной и той же папке –

Смежные вопросы