Java 在固定大小的JPanel中显示未知数量的JButton

Java 在固定大小的JPanel中显示未知数量的JButton,java,swing,layout-manager,jscrollpane,Java,Swing,Layout Manager,Jscrollpane,所以我在做一个小的Uno游戏,Swing好像很喜欢踢我的屁股。我遇到的问题是,当一个玩家看到并选择下哪张牌时。我有一个固定大小的面板和一个动态数量的卡片(带有图像图标的按钮)。我目前正在使用FlowLayout使这些卡片看起来很漂亮,但是如果卡片太多,它们就会从底部消失 我想写的一个优雅的解决方案是在所有卡片上画一行,然后根据数量计算卡片之间的距离,这样它们就可以均匀地分布在面板上。如果有很多卡片,它们会重叠,这可以通过一个JLayeredPane很好地解决。现在,我真的没有走多远,但如果你有一

所以我在做一个小的Uno游戏,Swing好像很喜欢踢我的屁股。我遇到的问题是,当一个玩家看到并选择下哪张牌时。我有一个固定大小的面板和一个动态数量的卡片(带有图像图标的按钮)。我目前正在使用FlowLayout使这些卡片看起来很漂亮,但是如果卡片太多,它们就会从底部消失

我想写的一个优雅的解决方案是在所有卡片上画一行,然后根据数量计算卡片之间的距离,这样它们就可以均匀地分布在面板上。如果有很多卡片,它们会重叠,这可以通过一个JLayeredPane很好地解决。现在,我真的没有走多远,但如果你有一个解决方案,我将非常感谢

现在第二个也是更重要的问题可能是我没有意识到我犯了一些愚蠢的错误。在这一点上,我会很高兴卡片消失在底部,只是有一个滚动条下来选择那些,但这似乎也不起作用

SSCCE:

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
公共类滚动测试{
公共静态void main(字符串[]args){
新的ScrollPaneTest().init();
}
公共void init(){
JFrame=新JFrame();
JPanel panel2=新的JPanel();
JPanel面板=新的JPanel();
面板。设置首选尺寸(新尺寸(200100));
面板.立根背景(颜色.绿色);
panel.setLayout(新的FlowLayout());
对于(int i=0;i<15;i++){
panel.add(新的JButton(“Hi:)”));
}
JScrollPane scroll=新的JScrollPane(面板);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HorizontalScrollBar\uAlways);
滚动添加(面板);
panel2.添加(panel,BorderLayout.WEST);
frame.getContentPane().add(panel2,BorderLayout.NORTH);
frame.setVisible(true);
frame.pack();
}
}
提前谢谢

JScrollPane scroll = new JScrollPane(panel);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.add(panel);
panel2.add(panel, BorderLayout.WEST);
这不是使用JScrollPane的方式。4行代码中每行的注释:

  • 第一行是正确的。这将创建一个JScrollPane并将该面板添加到滚动窗格的视口中

  • 您不需要设置滚动条策略。如果需要,滚动条将自动显示

  • 不要将组件直接添加到滚动窗格中。组件需要添加到滚动窗格的
    JViewport
    (这在代码的第一行中为您完成)

  • 不要将“面板”添加到其他面板。Swing组件只能有一个父组件。该语句将从滚动窗格中删除“面板”

  • 相反,您需要将滚动窗格添加到父面板:

    panel2.add(scroll, BorderLayout.WEST);
    

    滚动添加(面板)
    是错误的,在当前的上下文中,毫无意义的“我想写的优雅的解决方案是在所有卡片上有一行,然后根据数量计算卡片之间的距离,这样它们就可以均匀地分布在面板中。”-听起来好像你想写你自己的布局管理器;),但是我会考虑看看<代码> GridBagLayout <代码> FISTSTO,这样它们就可以均匀地分布在面板中。如果有很多牌的话,它们是重叠的,-我用过的纸牌游戏总是有牌重叠,而不是摊开。为此,您可以使用。是的,这很有效。谢谢你的帮助,我有点差劲。D。我还是要看看你的照片,看起来很有希望。