0

私はJavaが初めてなので、助けてください:) メインメソッドとコンストラクタークラスRun()を持つMainFrameというスーパークラスが1つあります。MenuBarというサブクラスから JFrame のメニューバーを取得します。メニュー バーには、ActionListeners が実装された複数のサブクラスがあります。メインフレームコンストラクター メソッドRun() コードで初期化されたJPanelからすべての要素を削除するメインフレーム スーパークラスからメソッドを呼び出すために ActionListener を使用しようとすると、常にエラーが発生します。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Arrays;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class MainFrame {
    JFrame mainFrame;
    JPanel mainPanel;
    JPanel[] pagePanels, tablePanels;
    JScrollPane scrollBar;

    private double zoom=1;
    private int width;
    private int height;
    private GridBagConstraints c;

    //private Page blankPage = new Page();
    MenuBar menubar;
    Page blankPage;

    public static void main(String[] args) {
        MainFrame generator = new MainFrame();
        generator.Run();
    }

    public void Run() {

        pagePanels = new JPanel[100];
        tablePanels = new JPanel[100];

        menubar = new MenuBar();
        blankPage = new Page();
        c = new GridBagConstraints();

        mainFrame = new JFrame("Code Generator v.1.0");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        c.gridx=0;
        c.insets = new Insets(20,0,20,0);
        //get size of screen
        GetScreenSize();

        mainPanel=new JPanel(new GridBagLayout());

        scrollBar=new JScrollPane(mainPanel);
        scrollBar.setPreferredSize(new Dimension(width,height));

        //create main frame with height and width equal to screen size (fullscreen)
        mainFrame.setJMenuBar(menubar.getMenuBar());
        mainFrame.getContentPane().add(scrollBar);
        mainFrame.setSize(width,height);
        mainFrame.setVisible(true);
    }

    public void GetScreenSize(){
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
        width = gd.getDisplayMode().getWidth();
        height = gd.getDisplayMode().getHeight();
    }

    public void RemoveAllfromMainPanel(){
        mainPanel.removeAll();
    }


}

サブクラスMenuBarのコードは次のとおりです。

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MenuBar  extends MainFrame{

    public JMenuBar getMenuBar(){

        JMenuBar menubar = new JMenuBar();

        //add menus to menu bar 
        JMenu file = new JMenu("File");
        menubar.add(file);

        //add items to File menu
        JMenuItem newReport = new JMenuItem("New report");
        file.add(newReport);
        newReport.addActionListener(new newReport());

        JMenuItem exit = new JMenuItem("Exit");
        file.add(exit);
        exit.addActionListener(new exitAction());

        return menubar;

    }

    class exitAction implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    }
    class newReport implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            RemoveAllfromMainPanel();
        }
    }
}

継承で何かをしなければならないと思いますが、それは私が最近研究し始めたトピックです. このエラーが発生する理由を教えてください:

スレッド「AWT-EventQueue-0」での例外 java.lang.NullPointerException at MainFrame.TEST(MainFrame.java:125)

この行で:

mainPanel.removeAll();

前もって感謝します!乾杯!

4

2 に答える 2

1

MenuBarから拡張するべきではありませんMainFrame。これは、メソッドから run メソッドによって作成されるインスタンスと同じではありません。mainつまり、mainPanelまだ初期化されていません。

代わりに、作成時にMenuBarインスタンスの参照を渡す必要がありますMainFrame

    menubar = new MenuBar(this);

そしてあなたのメニューバーで...

public class MenuBar {

    private MainFrame mainFrame;

    public MenuBar(MainFrame mainFrame) {
        this.mainFrame = mainFrame;
    }

    /* other code */


    class newReport implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            mainFrame.RemoveAllfromMainPanel();
        }
    }
 }
于 2013-07-05T21:06:04.047 に答える