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

Drop down menu not displaying (intellij gui editor)

我想了解 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)

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

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

好的,这是我根据您的代码制作的一些工作示例,我希望您阅读我的内容 changed/added/removed 并从那里开始工作。

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);
    }
}