[英]NullPointerException when adding JPanel from one class to a JFrame
I am creating a schedule program so that when someone enters in their eight class periods and click the "Enter Classes" button, the user can pick from a JComboBox of schedule names for my school. 我正在创建一个计划程序,以便当某人进入他们的八个课时并单击“输入课程”按钮时,用户可以从JComboBox中为我的学校选择计划名称。 I have little knowledge of Swing and this is my first Swing project.
我对Swing知之甚少,这是我的第一个Swing项目。
My issue: When a user clicks the "Enter Class" button on the content pane, the text entered into the JTextFields is added to an array. 我的问题:当用户单击内容窗格上的“输入类”按钮时,输入到JTextFields中的文本将添加到数组中。 After that, I attempt to set the content pane to invisible, add a panel from another class, and set that other panel visible.
之后,我尝试将内容窗格设置为不可见,从另一个类添加一个面板,然后将该其他面板设置为可见。 So far, I keep getting a wall of errors starting with the "AWT Event-Queue-0" NullPointerException.
到目前为止,从“ AWT Event-Queue-0” NullPointerException开始,我一直遇到很多错误。
Main Class: GUIRetry 主分类:GUIRetry
package Package;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class GUIRetry implements ActionListener {
public static void main (String[] args){
new GUIRetry().GUI();
}
public JFrame f;
public JButton button;
public JTextField zero;
public JTextField one;
public JTextField two;
public JTextField three;
public JTextField four;
public JTextField five;
public JTextField six;
public JTextField seven;
public JTextField eight;
public JPanel content;
public Component spane;
public ScheduleGetterGUI combo;
public String[] classes = new String[9];
public void GUI(){
f = new JFrame("SchoolHelper");
f.setSize(275, 600);
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
content = new JPanel(new GridLayout(10, 2));
content.setBorder(BorderFactory.createLineBorder(Color.black, 2));
JLabel enterzero = new JLabel("Enter Zero Period");
content.add(enterzero);
zero = new JTextField(15);
content.add(zero);
JLabel enterone = new JLabel("Enter First Period");
content.add(enterone);
one = new JTextField(15);
content.add(one);
JLabel entertwo = new JLabel("Enter Second Period");
content.add(entertwo);
two = new JTextField(15);
content.add(two);
JLabel enterthree = new JLabel("Enter Third Period");
content.add(enterthree);
three = new JTextField(15);
content.add(three);
JLabel enterfour = new JLabel("Enter Fourth Period");
content.add(enterfour);
four = new JTextField(15);
content.add(four);
JLabel enterfive = new JLabel("Enter Fifth Period");
content.add(enterfive);
five = new JTextField(15);
content.add(five);
JLabel entersix = new JLabel("Enter Sixth Period");
content.add(entersix);
six = new JTextField(15);
content.add(six);
JLabel enterseven = new JLabel("Enter Seventh Period");
content.add(enterseven);
seven = new JTextField(15);
content.add(seven);
JLabel entereight = new JLabel("Enter Eight Period");
content.add(entereight);
eight = new JTextField(15);
content.add(eight);
JLabel space = new JLabel("");
content.add(space);
button = new JButton("Enter Classes");
button.setActionCommand("submit");
button.addActionListener(this);
content.add(button);
f.setContentPane(content);
content.setVisible(true);
f.setVisible(true);
}
public void actionPerformed(ActionEvent e){
if("submit".equals(e.getActionCommand())){
String zerot = zero.getText();
classes[0] = zerot;
String onet = one.getText();
classes[1] = onet;
String twot = two.getText();
classes[2] = twot;
String threet = zero.getText();
classes[3] = threet;
String fourt = zero.getText();
classes[4] = fourt;
String fivet = five.getText();
classes[5] = fivet;
String sixt = zero.getText();
classes[6] = sixt;
String sevent = zero.getText();
classes[7] = sevent;
String eightt = eight.getText();
classes[8] = eightt;
content.setVisible(false);
f.add(spane);
System.out.println(Arrays.toString(classes));
}
}
}
Second Class: ScheduleGetterGUI 第二类:ScheduleGetterGUI
package Package;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JPanel;
public class ScheduleGetterGUI implements ActionListener{
public GUIRetry classes;
public GUIRetry f;
public String[] schedules = new String[7];
public JComboBox<String> combo;
public JPanel spane;
public static void main (String[] args){
new ScheduleGetterGUI().Schedule();
}
public void Schedule(){
spane = new JPanel();
spane.setLayout(new GridLayout(10,2));
schedules[0] = "R1";
schedules[1] = "R2";
schedules[2] = "Homeroom";
schedules[3] = "Mass";
schedules[4] = "Block Odd";
schedules[5] = "Block Even";
schedules[6] = "Late Start";
combo = new JComboBox<String>(schedules);
combo.setSelectedIndex(0);
combo.addActionListener(this);
combo.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent f) {
String s = (String) combo.getSelectedItem();
switch (s){
case "R1": combo.setSelectedIndex(0);
case "R2": combo.setSelectedIndex(1);
case "Homeroom": combo.setSelectedIndex(2);
case "Mass": combo.setSelectedIndex(3);
case "Block Odd": combo.setSelectedIndex(4);
case "Block Even": combo.setSelectedIndex(5);
case "Late Start": combo.setSelectedIndex(6);
default: combo.setSelectedIndex(0);
}
}
}
Full Error that occurs after you click "Enter Classes" 单击“输入类”后发生的完全错误
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.awt.Container.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at javax.swing.JFrame.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at Package.GUIRetry.actionPerformed(GUIRetry.java:141)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
You haven't initialized the spane
variable in GUIRetry class. 您尚未在GUIRetry类中初始化
spane
变量。 That is what causing the exception. 这就是导致异常的原因。
Update: 更新:
Here is a quick fix to GUIRetry
class using CardLayout. 这是使用CardLayout对
GUIRetry
类的快速修复。 Now when you click on the Enter Classes button, the second panel will be shown. 现在,当您单击Enter Classes按钮时,将显示第二个面板。
import java.awt.CardLayout;
import java.awt.Color;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
class GUIRetry implements ActionListener {
public static void main(String[] args) {
new GUIRetry().GUI();
}
public JFrame f;
public JButton button;
public JTextField zero;
public JTextField one;
public JTextField two;
public JTextField three;
public JTextField four;
public JTextField five;
public JTextField six;
public JTextField seven;
public JTextField eight;
public JPanel content;
public JPanel panel2;
public ScheduleGetterGUI combo;
public String[] classes = new String[9];
final static String PANEL_1 = "Panel 1";
final static String PANEL_2 = "Panel 2";
CardLayout cardLayout;
public void GUI() {
f = new JFrame("SchoolHelper");
f.setSize(275, 600);
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
content = new JPanel(new GridLayout(10, 2));
content.setBorder(BorderFactory.createLineBorder(Color.black, 2));
JLabel enterzero = new JLabel("Enter Zero Period");
content.add(enterzero);
zero = new JTextField(15);
content.add(zero);
JLabel enterone = new JLabel("Enter First Period");
content.add(enterone);
one = new JTextField(15);
content.add(one);
JLabel entertwo = new JLabel("Enter Second Period");
content.add(entertwo);
two = new JTextField(15);
content.add(two);
JLabel enterthree = new JLabel("Enter Third Period");
content.add(enterthree);
three = new JTextField(15);
content.add(three);
JLabel enterfour = new JLabel("Enter Fourth Period");
content.add(enterfour);
four = new JTextField(15);
content.add(four);
JLabel enterfive = new JLabel("Enter Fifth Period");
content.add(enterfive);
five = new JTextField(15);
content.add(five);
JLabel entersix = new JLabel("Enter Sixth Period");
content.add(entersix);
six = new JTextField(15);
content.add(six);
JLabel enterseven = new JLabel("Enter Seventh Period");
content.add(enterseven);
seven = new JTextField(15);
content.add(seven);
JLabel entereight = new JLabel("Enter Eight Period");
content.add(entereight);
eight = new JTextField(15);
content.add(eight);
JLabel space = new JLabel("");
content.add(space);
button = new JButton("Enter Classes");
button.setActionCommand("submit");
button.addActionListener(this);
content.add(button);
cardLayout = new CardLayout();
f.getContentPane().setLayout(cardLayout);
f.getContentPane().add(content);
panel2 = new JPanel();
panel2.add(new JLabel("This is panel 2"));
f.add(content, PANEL_1);
f.add(panel2, PANEL_2);
f.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if ("submit".equals(e.getActionCommand())) {
String zerot = zero.getText();
classes[0] = zerot;
String onet = one.getText();
classes[1] = onet;
String twot = two.getText();
classes[2] = twot;
String threet = zero.getText();
classes[3] = threet;
String fourt = zero.getText();
classes[4] = fourt;
String fivet = five.getText();
classes[5] = fivet;
String sixt = zero.getText();
classes[6] = sixt;
String sevent = zero.getText();
classes[7] = sevent;
String eightt = eight.getText();
classes[8] = eightt;
cardLayout.show(f.getContentPane(), PANEL_2);//Also "Panel 2" can be used as the second argument
System.out.println(Arrays.toString(classes));
}
}
}
References: https://docs.oracle.com/javase/tutorial/uiswing/layout/card.html 参考: https : //docs.oracle.com/javase/tutorial/uiswing/layout/card.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.