Java JScrollPane滚动条不会显示?

Java JScrollPane滚动条不会显示?,java,swing,jscrollpane,null-layout-manager,Java,Swing,Jscrollpane,Null Layout Manager,我不知道为什么滚动条不会出现。JPanel比JScrollPane大,所以我认为它应该出现。另外,当我尝试在滚动窗格中使用setPreferredSize而不是setBounds或setSize时,根本没有显示任何内容。我的最终目标是在程序右侧关闭一个按钮,以添加另一组按钮(循环中的按钮),用于选择另一项。我希望程序以10行按钮开始,但我将其设置为20以测试滚动条。是因为没有布局还是我弄乱了滚动窗格?问题在于没有使用正确的Swing布局 这是我创建的GUI 我在按钮和组合框中添加了文本,因此GU

我不知道为什么滚动条不会出现。JPanel比JScrollPane大,所以我认为它应该出现。另外,当我尝试在滚动窗格中使用setPreferredSize而不是setBounds或setSize时,根本没有显示任何内容。我的最终目标是在程序右侧关闭一个按钮,以添加另一组按钮(循环中的按钮),用于选择另一项。我希望程序以10行按钮开始,但我将其设置为20以测试滚动条。是因为没有布局还是我弄乱了滚动窗格?

问题在于没有使用正确的Swing布局

这是我创建的GUI

我在按钮和组合框中添加了文本,因此GUI看起来更真实。我注释掉了关注GUI的外观和感觉。我更改了类的名称,因为我为堆栈溢出编写的所有代码都有一个测试包

我用一个单独的方法创建了按钮JPanel。我使用了网格布局。这允许我创建20行3个Swing组件。这也让我能够将组件隔开一点

我用另一种方法创建了scroll JPanel。关键是使用滚动JPanel的边框布局。我使滚动按钮JPanel的大小为按钮JPanel的一半,这样它就可以滚动了。您可以根据需要调整此计算

下面是完整的可运行代码

package me.an.ugm;

import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;

public class Application
{
    private JFrame frame;

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    Application window = new Application();
                    window.frame.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }

        });
    }

    public Application()
    {
        initialize();
    }

    private void initialize()
    {
        frame = new JFrame();
        frame.setTitle("Application");
        frame.setBounds(100, 100, 401, 450);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        //frame.setResizable(false);
        frame.setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        panel.setBounds(0, 0, 296, 710);
        panel.setLayout(null);

        JScrollPane scrollPane = new JScrollPane(panel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setBounds(0, 0, 296, 399);
        frame.getContentPane().add(scrollPane);

        for (int i = 0, j = 10; i < 20; i++, j += 35)
        {
            JButton button1 = new JButton();
            button1.setBounds(10, j, 25, 25);
            panel.add(button1);

            JComboBox<String> selectorBox = new JComboBox<>();
            selectorBox.setBounds(40, j, 200, 25);
            panel.add(selectorBox);

            JButton button2 = new JButton();
            button2.setBounds(245, j, 25, 25);
            panel.add(button2);
        }
    }
}

问题在于没有使用正确的Swing布局

这是我创建的GUI

我在按钮和组合框中添加了文本,因此GUI看起来更真实。我注释掉了关注GUI的外观和感觉。我更改了类的名称,因为我为堆栈溢出编写的所有代码都有一个测试包

我用一个单独的方法创建了按钮JPanel。我使用了网格布局。这允许我创建20行3个Swing组件。这也让我能够将组件隔开一点

我用另一种方法创建了scroll JPanel。关键是使用滚动JPanel的边框布局。我使滚动按钮JPanel的大小为按钮JPanel的一半,这样它就可以滚动了。您可以根据需要调整此计算

下面是完整的可运行代码

package me.an.ugm;

import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;

public class Application
{
    private JFrame frame;

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                try
                {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    Application window = new Application();
                    window.frame.setVisible(true);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }

        });
    }

    public Application()
    {
        initialize();
    }

    private void initialize()
    {
        frame = new JFrame();
        frame.setTitle("Application");
        frame.setBounds(100, 100, 401, 450);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        //frame.setResizable(false);
        frame.setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        panel.setBounds(0, 0, 296, 710);
        panel.setLayout(null);

        JScrollPane scrollPane = new JScrollPane(panel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setBounds(0, 0, 296, 399);
        frame.getContentPane().add(scrollPane);

        for (int i = 0, j = 10; i < 20; i++, j += 35)
        {
            JButton button1 = new JButton();
            button1.setBounds(10, j, 25, 25);
            panel.add(button1);

            JComboBox<String> selectorBox = new JComboBox<>();
            selectorBox.setBounds(40, j, 200, 25);
            panel.add(selectorBox);

            JButton button2 = new JButton();
            button2.setBounds(245, j, 25, 25);
            panel.add(button2);
        }
    }
}

不要使用空布局!!!Swing设计用于布局管理器。使用空布局时,滚动窗格将不起作用。请记住,LayoutManager旨在帮助开发人员。他们在幕后做了很多事情,以使需要花费大量精力才能完成的工作得以顺利进行。为什么不想使用它们?不要使用空布局!!!Swing设计用于布局管理器。使用空布局时,滚动窗格将不起作用。请记住,LayoutManager旨在帮助开发人员。他们在幕后做了很多事情,以使需要花费大量精力才能完成的工作得以顺利进行。你为什么不想用它们呢?