2016-10-05 9 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'が返ってくることに注意してください。 – Jesper

+0

'のC:\ JSDK> Javaのhtw10 htw10.startで "メイン" スレッドで 例外java.lang.NullPointerExceptionが (htw10.java:25)htw10.main(htw10.java:69)' 私はで nullを見つけることができません... –

+0

25行目が 'content.setLayout(new FlowLayout());'の場合、 'content'は' null'を意味します。今はなぜそれを見つけるのがあなたの仕事です。 – Jesper

答えて

0

のような他の方法を試すことができ、あなたはメンバ変数contentを宣言しているが、あなたはそれを初期化されていません。メンバー変数あなたがそれらを自分で初期化しない場合は、自動的にnullに初期化されます:行25で

private JPanel content; // is automatically set to null 

あなたはcontent上のメソッドsetLayoutを呼び出している:

content.setLayout(new FlowLayout()); 

これはNullPointerExceptioncontentためである原因になります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

'公開JPanel introPanel() \t { \t \t JPanel iPanel =新しいJPanel(); \t \t ImageIcon icon = new ImageIcon( "img1.jpg"); \t \t JLabel picLabel =新しいJLabel(アイコン); \t \t iPanel.add(picLabel); \t \t \t \t ButtonGroup = new ButtonGroup(); \t \t JButton b1 = new JButton( "Instructions"); \t \t JButton b2 =新しいJButton( "再生"); \t \t JButton b3 =新しいJButton( "Exit"); \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; 
} 

あなたはdrawImageメソッドを呼び出すためのグラフィックス(java.awt.Graphics)オブジェクトが必要です。

もっとオーバーあなたがライン14で

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:htw10.mainでhtw10.startで\ JSDK>スレッドのJava htw10 例外 "メイン" java.lang.NullPointerExceptionが (htw10.java:25) (htw10.java:70) –

+0

はIMG1の経路であります.jpg正しい? – WitVault

+0

...プログラムと画像ファイルは同じフォルダに保存されます –

関連する問題