【问题标题】:Why is the GUI not working, is the code correct?为什么 GUI 不工作,代码是否正确?
【发布时间】:2013-08-07 14:39:06
【问题描述】:

所以我尝试创建 3 个面板。第一个面板具有布局集(例如单选按钮和下一个按钮)我现在添加两个具有不同背景颜色的新面板。但是当我执行代码时,我得到一个空点异常的错误。我该如何解决?

代码如下:

import java.awt.Color;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.CardLayout;
import javax.swing.*;

public class Wizard {

private JLabel lblPicture;
private JRadioButton btLdap, btKerbegos, btSpnego, btSaml2;
private JButton btNext;
private JPanel panel;
private JPanel panelFirst;
private JPanel panelSecond;
CardLayout c1 = new CardLayout();

    public static void main(String[] args) {
        new Wizard();
    }

    public Wizard() {

        JFrame frame = new JFrame("Wizard");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600,360);
        frame.setVisible(true);
        MyPanel();
        RadioButtons();
        Button();
        Image();
        groupButton();
        panel.setLayout(c1);
        panelFirst.setBackground(Color.BLUE);
        panelSecond.setBackground(Color.GREEN);
        panel.add(panelFirst,"1");
        panel.add(panelSecond,"2");
        c1.show(panel,"panel");
        frame.add(panel); 
        frame.pack();
        frame.setVisible(true);
    }

    public void MyPanel() {
        panel = new JPanel();
        panel.setLayout(null);
    }

    public void RadioButtons() {
        btLdap = new JRadioButton ("Ldap");
        btLdap.setBounds(60,85,100,20);
        panel.add(btLdap);

        btKerbegos = new JRadioButton ("Kerbegos");
        btKerbegos.setBounds(60,115,100,20);
        panel.add(btKerbegos);

        btSpnego =new JRadioButton("Spnego");
        btSpnego.setBounds(60,145,100,20);
        panel.add(btSpnego);

        btSaml2 = new JRadioButton("Saml2");
        btSaml2.setBounds(60,175,100,20);
        panel.add(btSaml2);
    }

    public void Button() {
        btNext = new JButton ("Next");
        btNext.setBounds(400,260,100,20);
        panel.add(btNext);
        btNext.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    c1.show(panel, "2");
                }
            });
    }

    public void Image() {
        ImageIcon image = new ImageIcon("image.jpg");
        lblPicture = new JLabel(image);
        lblPicture.setBounds(200,20, 330, 270);
        panel.add(lblPicture);
    }

    private void groupButton() {

        ButtonGroup bg1 = new ButtonGroup( );

        bg1.add(btLdap);
        bg1.add(btKerbegos);
        bg1.add(btSpnego);
        bg1.add(btSaml2);

    }

}

【问题讨论】:

  • 告诉我们空指针异常发生在哪里。哪条线。编辑您的问题以获得异常的完整堆栈跟踪。
  • "我收到 Null 点异常错误" ==> 发布堆栈跟踪,其中包含发生异常的确切行...
  • 这两行会抛出 NPE:panelFirst.setBackground(Color.BLUE); panelSecond.setBackground(Color.GREEN); 因为这些面板都没有被实例化...
  • 发布异常的堆栈跟踪总是一个好主意。

标签: java swing nullpointerexception jpanel


【解决方案1】:

当我去运行你的代码时,我得到你提到的空指针异常:

Exception in thread "main" java.lang.NullPointerException
    at Wizard.<init>(Wizard.java:35)
    at Wizard.main(Wizard.java:20)

所以,我在 Wizard 的构造函数中查找了生成它的行:

panelFirst.setBackground(Color.BLUE);

我看到您在 panelFirst 上设置一个属性,它是 Wizard 类的实例数据成员。

我没有看到您声明 panelFirst = new JPanel(); 的任何地方,这就是创建 NullPointerException 的原因。看起来您还没有初始化许多其他变量(例如,panel 是我看到的唯一已初始化的 JPanel)。

请在 Java API 中查找 JPanel 的构造函数,看看您希望如何为您的应用创建它们。您也可以考虑使用 IDE 为您生成 GUI 代码。

JPanel API(从 jdk 1.7 开始):http://docs.oracle.com/javase/7/docs/api/javax/swing/JPanel.html

谢谢

【讨论】:

    【解决方案2】:

    panelFirstpanelSecond 对象永远不会被创建。

    【讨论】:

      【解决方案3】:

      panelFirstpanelSecond 变量为 null 未声明。

      在设置面板背景之前,您需要先创建它:

      panelFirst= new JPanel();
      

      与 panelSecond 相同:

      panelSecond = new JPanel();
      

      当您遇到空指针异常(也称为 NPE)时:您应该尝试查找 uninitialized variable。当一个变量被声明但未初始化时,它的指针指向空(即它是一个空指针!)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-15
        • 2019-10-09
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多