不显示下拉菜单(intellij gui 编辑器)

时间:2021-06-25 21:52:21

标签: java swing nullpointerexception

我想了解 GUI 设计师。为此,我想从一个简单的程序开始,该程序有一个包含项目的下拉菜单。但由于某些原因,执行时不显示项目。

package DSA;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class App {
    public JPanel window_main;
    public JComboBox<String> Klimaauswahl;

    public App() {
        Klimaauswahl.addActionListener(new ActionListener() {
              @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
}

    public static void main(String[] args) {

        JFrame klima = new JFrame("Klimazone");
        klima.setContentPane(new App().window_main);
        klima.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        klima.pack();
        klima.setVisible(true);
        klima.setLocation(430, 100);


        String[] klimazonen;
        klimazonen = new String[]{ "Ewiges Eis", "Tundra", "Nördliche Steppen", "Nördliches 
        Hochland", "Kalkgebirge", "Mittelländische Gebirge", "Nördliche Wälder (Westküste)", 
        "Nördliche Wälder (Taiga)","Nördliche Wälder (Bornland)", "Nördliche Sümpfe", 
        "Mittelländisches Heideland", "Mittelländische Wälder", "Yaqirische Wälder", "Tobrische 
        Wälder", "Immergrüne Wälder", "Savanne", "Wüstenrandgebiete", "Wüste", "Südliche Gebirge", 
        "Maraskan", "Südliche Sümpfe", "Regenwald", "Regengebirge" };

        final JComboBox<String> Klimaauswahl = new JComboBox<>(klimazonen);
        klima.add(Klimaauswahl);
        Klimaauswahl.setVisible(true);
    }
}

GUI 表单本身包含一个名为“window_main”的 JPanel 和一个名为“Klimaauswahl”的 JComboBox。抱歉,我的变量和对象使用了德语单词,但对于我和我使用代码的伙伴来说,这样更容易理解。

当我执行程序时,没有编译错误。但是我在控制台中收到以下消息:

Exception in thread "main" java.lang.NullPointerException 
    at m.intellij.uiDesigner.core.GridLayoutManager.addLayoutComponent(GridLayoutManager.java:134)
    at java.awt.Container.addImpl(Container.java:1130)
    at java.awt.Container.add(Container.java:1007)
    at javax.swing.JFrame.addImpl(JFrame.java:567)
    at java.awt.Container.add(Container.java:419)
    at DSA.App.main(App.java:38)

最后程序被执行,但下拉菜单是空的。我真的希望我提供了所有信息。

1 个答案:

答案 0 :(得分:0)

您将内容窗格设置为 null,因为 window_main 在您使用之前从未被初始化。
对于您想要使用哪个 Klimaauswahl(请不要以大写开头的变量名)也存在一些混淆。 App 中有一个,还有另一个,实际上是在添加到框架的 main() 中初始化的。
我只能猜测您对这里的内容有些困惑。问问自己您的 App 实例变量是什么以及您创建它们的目的是什么。

好的,这是我根据您的代码制作的一些工作示例,我希望您阅读我更改/添加/删除的内容并从那里解决。

package dsa;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class App {

    public static void main(String[] args) {

        JFrame klima = new JFrame("Klimazone");
        JPanel actualContentPane = new JPanel();
        final JLabel sampleLabel = new JLabel( "Initialized text" );
        String[] klimazonen = { "Ewiges Eis", "Tundra", "Nördliche Steppen", "Nördliches Hochland",
            "Kalkgebirge", "Mittelländische Gebirge", "Nördliche Wälder (Westküste)", 
            "Nördliche Wälder (Taiga)","Nördliche Wälder (Bornland)", "Nördliche Sümpfe", 
            "Mittelländisches Heideland", "Mittelländische Wälder", "Yaqirische Wälder", "Tobrische Wälder",
            "Immergrüne Wälder", "Savanne", "Wüstenrandgebiete", "Wüste", "Südliche Gebirge", 
            "Maraskan", "Südliche Sümpfe", "Regenwald", "Regengebirge" };
            
        final JComboBox<String> klimaauswahl = new JComboBox<>(klimazonen);
        
        klimaauswahl.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) { 
                sampleLabel.setText( klimaauswahl.getSelectedItem().toString() );
            }
        });    
            
        klima.setContentPane( actualContentPane );
        klima.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        klima.setLocation(430, 100);
        klima.setSize( 300, 300 );

        klima.getContentPane().add(klimaauswahl);
        klima.getContentPane().add(sampleLabel);
        klima.setVisible(true);
    }
}
相关问题