Java JComboBox未显示

Java JComboBox未显示,java,swing,layout-manager,jcombobox,Java,Swing,Layout Manager,Jcombobox,Java新手。我无法显示下拉框 我最初在按钮前有代码,但是当我运行代码(intelliJ idea)时,下拉列表和按钮都没有出现 stackoverflow需要更多详细信息。不知道该补充什么。我相信这只是语法上的一个小错误 package com.example.guiTest; import javax.swing.*; import java.awt.*; import java.lang.Object; import java.awt.Component; import java.aw

Java新手。我无法显示下拉框

我最初在按钮前有代码,但是当我运行代码(intelliJ idea)时,下拉列表和按钮都没有出现

stackoverflow需要更多详细信息。不知道该补充什么。我相信这只是语法上的一个小错误

package com.example.guiTest;

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

import java.lang.Object;
import java.awt.Component;
import java.awt.Container;
import javax.swing.JComponent;
import javax.swing.JComboBox;

public class Main {

public static void main(String[] args) {

    JFrame window = new JFrame("Position");
    window.setVisible(true);
    window.setSize(500, 500);
    window.setResizable(true);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    window.setLocation(dim.width/2-window.getSize().width/2, dim.height/2-window.getSize().height/2);;

    JPanel panel = new JPanel();
    panel.setLayout(null);
    window.add(panel);

    JLabel test = new JLabel("This is a test");
    test.setBounds(20,0,120,120);
    panel.add(test);

    JButton button = new JButton("Compile");
    button.setBounds(250, 250, 120, 50);
    panel.add(button);


    String[] noteArray = {"a", "b"};

    JComboBox note = new JComboBox(noteArray);
    note.setPreferredSize(new Dimension(200,130));
    note.setLocation(new Point(200,200));
    note.setEditable(true);
    note.setSelectedIndex(3);
    note.setVisible(true);

    panel.add(note);






}

}

您在面板JPanel上使用的是
null
布局,快速回答是,null布局要求您完全指定所有添加组件的大小和位置,即大小而不是首选大小。你设置的是后者,而不是前者

更好的答案是不要使用
null
布局和
setBounds(…)
。虽然空布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

编辑:
或者,您最终将JComboBox放在JButton的正上方(就像您的代码一样!)

编辑:
另一个问题:在将所有组件添加到GUI之前,不要在JFrame上调用
setVisible(true)

编辑:
还有另一个问题:
note.setSelectedIndex(3)
“注释”组合框中只有2个项目,为什么要将所选索引设置为3?这是注定要失败的

例如:

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

public class BetterMain extends JPanel {
    private static final String[] ITEMS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    private static final int ROWS = 25;
    private static final int COLUMNS = 40;
    private JButton button = new JButton("Button");
    private JTextField textField = new JTextField(COLUMNS / 2);
    private JComboBox<String> myCombo = new JComboBox<>(ITEMS);
    private JTextArea textArea = new JTextArea(ROWS, COLUMNS);    

    public BetterMain() {
        JPanel topPanel = new JPanel();
        topPanel.add(new JLabel("This is a JLabel"));
        topPanel.add(myCombo);
        topPanel.add(textField);
        topPanel.add(button);

        JScrollPane scrollPane = new JScrollPane(textArea);

        setLayout(new BorderLayout());
        add(scrollPane, BorderLayout.CENTER);
        add(topPanel, BorderLayout.PAGE_START);
    }

    private static void createAndShowGui() {
        BetterMain mainPanel = new BetterMain();

        JFrame frame = new JFrame("BetterMain");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入javax.swing.*;
公共类BetterMain扩展JPanel{
私有静态最终字符串[]项={“星期一”、“星期二”、“星期三”、“星期四”、“星期五”};
私有静态最终整数行=25;
私有静态最终整数列=40;
私有JButton按钮=新JButton(“按钮”);
私有JTextField textField=新JTextField(列/2);
私人JComboxMyCombo=新JComboxy(项目);
私有JTextArea textArea=新的JTextArea(行、列);
公共投注者(){
JPanel-topPanel=新的JPanel();
添加(新JLabel(“这是一个JLabel”);
topPanel.add(myCombo);
topPanel.add(文本字段);
topPanel.add(按钮);
JScrollPane scrollPane=新的JScrollPane(textArea);
setLayout(新的BorderLayout());
添加(滚动窗格,BorderLayout.CENTER);
添加(topPanel,BorderLayout.PAGE_START);
}
私有静态void createAndShowGui(){
BetterMain主面板=新BetterMain();
JFrame=新JFrame(“BetterMain”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}

您在面板JPanel上使用的是
null
布局,快速回答是,null布局要求您完全指定所有添加组件的大小和位置,即大小而不是首选大小。你设置的是后者,而不是前者

更好的答案是不要使用
null
布局和
setBounds(…)
。虽然空布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

编辑:
或者,您最终将JComboBox放在JButton的正上方(就像您的代码一样!)

编辑:
另一个问题:在将所有组件添加到GUI之前,不要在JFrame上调用
setVisible(true)

编辑:
还有另一个问题:
note.setSelectedIndex(3)
“注释”组合框中只有2个项目,为什么要将所选索引设置为3?这是注定要失败的

例如:

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

public class BetterMain extends JPanel {
    private static final String[] ITEMS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    private static final int ROWS = 25;
    private static final int COLUMNS = 40;
    private JButton button = new JButton("Button");
    private JTextField textField = new JTextField(COLUMNS / 2);
    private JComboBox<String> myCombo = new JComboBox<>(ITEMS);
    private JTextArea textArea = new JTextArea(ROWS, COLUMNS);    

    public BetterMain() {
        JPanel topPanel = new JPanel();
        topPanel.add(new JLabel("This is a JLabel"));
        topPanel.add(myCombo);
        topPanel.add(textField);
        topPanel.add(button);

        JScrollPane scrollPane = new JScrollPane(textArea);

        setLayout(new BorderLayout());
        add(scrollPane, BorderLayout.CENTER);
        add(topPanel, BorderLayout.PAGE_START);
    }

    private static void createAndShowGui() {
        BetterMain mainPanel = new BetterMain();

        JFrame frame = new JFrame("BetterMain");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入javax.swing.*;
公共类BetterMain扩展JPanel{
私有静态最终字符串[]项={“星期一”、“星期二”、“星期三”、“星期四”、“星期五”};
私有静态最终整数行=25;
私有静态最终整数列=40;
私有JButton按钮=新JButton(“按钮”);
私有JTextField textField=新JTextField(列/2);
私人JComboxMyCombo=新JComboxy(项目);
私有JTextArea textArea=新的JTextArea(行、列);
公共投注者(){
JPanel-topPanel=新的JPanel();
添加(新JLabel(“这是一个JLabel”);
topPanel.add(myCombo);
topPanel.add(文本字段);
topPanel.add(按钮);
JScrollPane scrollPane=新的JScrollPane(textArea);
setLayout(新的BorderLayout());
添加(滚动窗格,BorderLayout.CENTER);
添加(topPanel,BorderLayout.PAGE_START);
}
私有静态void createAndShowGui(){
BetterMain主面板=新BetterMain();
JFrame=新JFrame(“BetterMain”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
创造