java - 如何使用子类中的 Action 监听器从父类(super class)中的 JPanel 中删除所有元素?

标签 java swing jpanel subclass actionlistener

我是 Java 新手,请帮忙:) 我有一个名为 MainFrame 的父类(super class),其中包含 main 方法和构造函数类 Run()。 我从名为 MenuBar 的子类获取 JFrame 的菜单栏。 菜单栏有多个子类,并实现了 ActionListener。 每当我尝试使用 ActionListener 调用 MainFrame 父类(super class)中的方法时,都会收到错误,该方法会从 JPanel 中删除在 MainFrame 中初始化的所有元素> 构造方法Run() 大型机代码:

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 在 MainFrame.TEST(MainFrame.java:125)

在这一行:

ma​​inPanel.removeAll();

提前谢谢您!干杯!

最佳答案

您的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();
        }
    }
 }

关于java - 如何使用子类中的 Action 监听器从父类(super class)中的 JPanel 中删除所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17496591/

相关文章:

java - Bellman Ford Display 的每一次迭代的前身

java - JVM G1GC 的混合 gc 没有收集太多旧区域

java - JSR-303 @有效注释不适用于子对象列表

swing - 与 Swing 相关的 Scala NoClassDefFoundError

java - JButton 位于 JPanel 上,但它不应该位于 JPanel 上

java - JPanel 不填充包含 JFrame

java - 使用udp发送实时语音

java - 模拟MouseEvent、KeyEvent等

java - 将项目添加到 JList

Java Swing——Jpanel,Jtable 中嵌入了 Jbuttons