Java 面板没有';我不想滚动

Java 面板没有';我不想滚动,java,swing,jscrollpane,jcomponent,Java,Swing,Jscrollpane,Jcomponent,我有这段代码(一个包含其他JComponents的面板,在本例中是JButtons)和一个问题 import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.util.*; public class JTagPanelTest extends JPanel{ public JTagPanelTest(){ setLayout(new FlowLayout(FlowLa

我有这段代码(一个包含其他
JComponent
s的面板,在本例中是
JButton
s)和一个问题

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

public class JTagPanelTest extends JPanel{

    public JTagPanelTest(){
        setLayout(new FlowLayout(FlowLayout.LEADING, 2, 0));
    }

    public void initializeTags(List<String> tags){
        tags.forEach(tag -> add(new JButton(tag)));
    }

    public static void main(String[] args){
        EventQueue.invokeLater(() -> {
            try{
                String lookAndFeelName = UIManager.getSystemLookAndFeelClassName();
                UIManager.setLookAndFeel(lookAndFeelName);
            }
            catch(Exception e){
                e.printStackTrace();
            }

            JTagPanelTest test = new JTagPanelTest();
            test.initializeTags(Arrays.asList("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
                "012", "qwer", "z<xc", "rty", "poiu", "gfj", "zxcv", "mjnb", "mko", "nij", "bhu"));
            JScrollPane scrollPane = new JScrollPane(test);
            scrollPane.setHorizontalScrollBar(null);
            test.setPreferredSize(new Dimension(200, 100));
//          scrollPane.setPreferredSize(new Dimension(200, 180));
            JFrame frame = new JFrame("Test");
            frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(new Dimension(200, 180));
            frame.setLocationRelativeTo(null);
            frame.setResizable(false);
            frame.setVisible(true);
        });
    }

}
import javax.swing.*;
导入javax.swing.border.*;
导入java.awt.*;
导入java.util.*;
公共类JTagPanelTest扩展了JPanel{
公共JTagPanelTest(){
setLayout(新的FlowLayout(FlowLayout.LEADING,2,0));
}
公共无效初始值标记(列表标记){
tags.forEach(tag->add(newjbutton(tag));
}
公共静态void main(字符串[]args){
EventQueue.invokeLater(()->{
试一试{
字符串lookAndFeelName=UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeelName);
}
捕获(例外e){
e、 printStackTrace();
}
JTagPanelTest=新的JTagPanelTest();
测试.初始化标记(数组.asList(“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”、“十”),

“012”、“qwer”、“z您尝试了正确的方法,在
滚动窗格
上设置了首选大小

因此,请还原到该更改。它不滚动的原因是您的内容没有添加为垂直对齐。设置布局有助于垂直添加项目

例如:

test.setLayout(new BoxLayout(test, BoxLayout.Y_AXIS));
//test.setPreferredSize(new Dimension(200, 100));
scrollPane.setPreferredSize(new Dimension(200, 180));

通过在
滚动窗格
上设置首选大小,您尝试了正确的方法

因此,请还原到该更改。它不滚动的原因是您的内容没有添加为垂直对齐。设置布局有助于垂直添加项目

例如:

test.setLayout(new BoxLayout(test, BoxLayout.Y_AXIS));
//test.setPreferredSize(new Dimension(200, 100));
scrollPane.setPreferredSize(new Dimension(200, 180));

我还发现它解决了垂直堆叠组件的问题。并且。

我还发现它解决了垂直堆叠组件的问题。并且。

我知道您希望按钮包装,因此您将它们添加到使用
FlowLayout
布局管理器的
JPanel
中。我还知道您希望包含这些按钮的
JPanel
滚动。我通过设置
JScrollPane
和包含这些按钮的
JPanel
的首选大小来实现这一点,如下代码所示

导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.util.array;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.WindowConstants;
公共类BtnScrl实现可运行{
公开募捐{
showGui();
}
私有void showGui(){
JFrame=新JFrame(“BtnScrl”);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createButtons());
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
私有JScrollPane createButtons(){
JPanel面板=新的JPanel();
面板。设置首选尺寸(新尺寸(400290));
对于(字符串标记:Arrays.asList(“一”),
“两个”,
“三”,
“四”,
“五个”,
“六”,
“七”,
“八”,
“九”,
“十”,
"012",
“qwer”,

"z我知道您希望按钮被包装,因此您可以将它们添加到使用
FlowLayout
布局管理器的
JPanel
中。我也知道您希望包含这些按钮的
JPanel
滚动。我通过设置
JScrollPane
JPanel
的首选大小来实现这一点包含按钮,如下面的代码所示

导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.util.array;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.WindowConstants;
公共类BtnScrl实现可运行{
公开募捐{
showGui();
}
私有void showGui(){
JFrame=新JFrame(“BtnScrl”);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createButtons());
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
私有JScrollPane createButtons(){
JPanel面板=新的JPanel();
面板。设置首选尺寸(新尺寸(400290));
对于(字符串标记:Arrays.asList(“一”),
“两个”,
“三”,
“四”,
“五个”,
“六”,
“七”,
“八”,
“九”,
“十”,
"012",
“qwer”,

“zNote所有Swing组件都应该在事件分派线程(EDT)上创建。因此,所有代码,而不仅仅是setVisible(…)都应该是
调用器(…)
This
test.setPreferredSize(新维度(200100))的一部分;
人为地限制测试JPanel的大小。您肯定不想这样做。如果我删除该行,按钮不会在面板的边缘缠绕注意所有Swing组件都应该在事件调度线程(EDT)上创建。因此,所有代码,而不仅仅是setVisible(…)都应该是
调用器(…)的一部分
测试。设置PreferredSize(新维度(200100));
人为约束