2016-07-03 4 views
-1

次のコードでは、フルスクリーンメニューを設計しようとしています。これを行うには、私は2つのJPanelsを使用することが最善であると思った。私の問題は、JPanelsの間で切り替えるときにjava.lang.NullPointerExceptionとなる。例外は、この行である101行目で発生することを示しています。 m.getMainWindow().getContentPane().setComponentZOrder(m.getOverlay(), 0);元々私は問題がインスタンスの問題であると信じていました。しかし、public class Menuの末尾にあるmainボイドに使用されているmenu変数を渡すと、関連するすべてのメソッドが引き続き発生します。私は自分の問題を解決する助けに感謝します。nullポインタ正しい変数を渡しても例外がまだ発生しています

コード

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import net.miginfocom.swing.MigLayout; 

public class Menu { 
    JFrame myMainWindow = new JFrame("Menu test"); 
    GridBagConstraints c; 
    JLayeredPane lP; 
    MyFirstPanel fP; 
    MyOverlay oL; 
    MigLayout baseLayout; 
    MigLayout overlayLayout; 

    private void runGUI(Menu m) {  
     myMainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     myMainWindow.setLayout(new GridBagLayout()); 
     setContraints(); 
     createPanels(m); 
     myMainWindow.getContentPane().add(fP, c); 
     myMainWindow.getContentPane().add(oL, c); 
     myMainWindow.pack(); 
     myMainWindow.setVisible(true); 
    } 

    private void setContraints() { 
     c = new GridBagConstraints(); 
     c.gridx = 0; 
     c.gridy = 0; 
     c.weightx = 1; 
     c.weighty = 1; 
     c.fill = GridBagConstraints.BOTH; 
    } 

    private void createPanels(Menu m) { 
     createFirstPanel(m); 
     createOverlay(); 
    } 

    private void createFirstPanel(Menu m) { 
     baseLayout = new MigLayout("", "", ""); 
     fP = new MyFirstPanel(baseLayout, m); 

    } 

    private void createOverlay() { 
     overlayLayout = new MigLayout("", "", ""); 
     oL = new MyOverlay(overlayLayout, true); 

    } 

    public JPanel getOverlay() { 
     return oL; 
    } 

    public JFrame getMainWindow() { 
     return myMainWindow; 
    } 

    public static void main(String[] args) { 
     Menu menu = new Menu(); 
     menu.runGUI(menu); 
    } 
} 

class MyFirstPanel extends JPanel { 
    MyFirstPanel(MigLayout layout, Menu mM) { 
     setLayout(layout); 
     setBackground(Color.RED); 
     setPreferredSize(new Dimension(600, 600)); 
     add(new JLabel("hiasdfadsf"), "wrap"); 
     JButton jb = new JButton("Press Me"); 
     jb.addActionListener(new CustomActionListener(mM)); 
     add(jb); 
    } 
} 

class MyOverlay extends JPanel { 
    MyOverlay(MigLayout layout, boolean visible) { 
     setBackground(Color.GREEN); 
     setPreferredSize(new Dimension(600, 600)); 
     add(new JLabel("hi")); 

     setVisible(visible); 
    } 
} 

class CustomActionListener implements ActionListener { 
    Menu m; 

    public CustomActionListener(Menu mM) { 
     this.m = mM; 
     m.getMainWindow().getContentPane().setComponentZOrder(m.getOverlay(), 0); 
    } 

    public void actionPerformed(ActionEvent e) { 
     m.getMainWindow().getContentPane().setComponentZOrder(m.getOverlay(), 0); 
    } 
} 

例外

Exception in thread "main" java.lang.NullPointerException 
    at java.awt.Container.setComponentZOrder(Container.java:760) 
    at packages.CustomActionListener.<init>(Menu.java:101) 
    at packages.MyFirstPanel.<init>(Menu.java:75) 
    at packages.Menu.createFirstPanel(Menu.java:44) 
    at packages.Menu.createPanels(Menu.java:38) 
    at packages.Menu.runGUI(Menu.java:21) 
    at packages.Menu.main(Menu.java:64) 
+0

[NullPointerExceptionとは何か、それを修正するにはどうすればいいですか?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix -it) – Frakcool

+1

ZOrderで遊ぼうとしないでください。パネルを交換する場合は、[カードレイアウト](http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html)を使用します。また、コードを投稿するときには、JDKクラスのみが含まれている必要があります。 MigLayoutはJDKの一部ではありません。コードをテストすることはできません。 – camickr

+0

@camickr情報をありがとう、私は次回にmigレイアウトを残しておきます – Dan

答えて

2

方法getOverlay()はnullを返します。それは返すオーバーレイがそうオーバーレイが最初のパネルの後を作成している

private void createPanels(Menu m) { 
    createFirstPanel(m); 
    createOverlay(); 
} 

に作成されます。しかし、最初のパネルの作成には、オーバーレイが存在する必要があります。これらの2つの命令を逆にすると問題が解決されます。

+0

これを行う際に、 'java.lang.IllegalArgumentException:コンポーネントとコンテナは同じトップレベルウィンドウになければなりません.'が作成されます。 – Dan

+0

それは別の問題です。スタックトレースを調べたり、javadocを読み込んだりするなど、スタックの意味を理解してみてください。スタックしている場合は、別の質問をしてください。 –

+0

問題ありません。それを行うだろう – Dan

関連する問題