Проблема с GridBagLayout в Java Swing

У меня есть простая проблема с моим JPanel/Gridbaglayout:

import javax.swing.*;
import java.awt.*;



public class gridfenster extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;

    private JButton b1=null;
    private GridBagLayout gbl = null; // i tried it without this line!

    /**
     * @param args
     */
    public  void main() {
        // TODO Auto-generated method stub

        SwingUtilities.invokeLater(new Runnable()
                {
        public void run(){
            gridfenster thisClass = new gridfenster();
            thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
            thisClass.setVisible(true);
        }
    });

    }

    /**
     * @param owner
     */
    public  gridfenster() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("testgridbag");
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            GridBagLayout gbl = new GridBagLayout();
            jContentPane.setLayout(gbl);
            GridBagConstraints gc = new GridBagConstraints();



            //konkrete Elemente:
            gc.fill =GridBagConstraints.HORIZONTAL ;
            gc.gridx =0; gc.gridy=0;
            gbl.setConstraints(b1,gc);
            jContentPane.add(b1);

        }
        return jContentPane;
    }

}

Затем я получаю следующую ошибку:

IWAV0052E Invocation Target Exception creating gridfenster
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.eclipse.ve.internal.java.vce.launcher.remotevm.JFCLauncher$1.run(JFCLauncher.java:59)
    at java.awt.event.InvocationEvent.dispatch(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)
Caused by: java.lang.NullPointerException
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at gridfenster.getJContentPane(gridfenster.java:71)
    at gridfenster.initialize(gridfenster.java:49)
    at gridfenster.<init>(gridfenster.java:39)
    ... 13 more

person Tyzak    schedule 29.01.2010    source источник


Ответы (3)


Вы не инициализировали поле b1. Вы не можете добавить null в контейнер.

person Geoff Reedy    schedule 29.01.2010
comment
Да, это правильно. Проблема, которую я указал, является отдельной проблемой и может даже не быть проблемой вообще. - person Bill the Lizard; 29.01.2010

Вам необходимо инициализировать подкомпоненты, прежде чем добавлять их в контейнер. Панель содержимого, в которую вы помещаете b1, понятия не имеет, как обращаться с кнопкой, потому что на самом деле ее еще не существует.

person Jon    schedule 29.01.2010

Вы объявили, что «b1» — это JButton, но никогда не создавали его экземпляр.

Где-то перед gbl.setConstraints(b1,gc) нужно сказать b1=new JButton();

person David Koelle    schedule 29.01.2010