我是 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)
在这一行:
mainPanel.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/