簡體   English   中英

將JPanel從一個類添加到JFrame時發生NullPointerException

[英]NullPointerException when adding JPanel from one class to a JFrame

我正在創建一個計划程序,以便當某人進入他們的八個課時並單擊“輸入課程”按鈕時,用戶可以從JComboBox中為我的學校選擇計划名稱。 我對Swing知之甚少,這是我的第一個Swing項目。

我的問題:當用戶單擊內容窗格上的“輸入類”按鈕時,輸入到JTextFields中的文本將添加到數組中。 之后,我嘗試將內容窗格設置為不可見,從另一個類添加一個面板,然后將該其他面板設置為可見。 到目前為止,從“ AWT Event-Queue-0” NullPointerException開始,我一直遇到很多錯誤。

主分類: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));
    }
}   
}

第二類: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);

    }
}

}

單擊“輸入類”后發生的完全錯誤

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)

您尚未在GUIRetry類中初始化spane變量。 這就是導致異常的原因。

更新:

這是使用CardLayout對GUIRetry類的快速修復。 現在,當您單擊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));
    }
}
}

參考: https : //docs.oracle.com/javase/tutorial/uiswing/layout/card.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM