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

时间:2019-07-03 00:27:05

标签: java swing layout-manager jscrollpane

所以我正在做一个小的Uno游戏,Swing似乎喜欢踢屁股。我遇到的问题是,当玩家看到并选择放下哪张卡时。我有一个给定的面板,具有固定的大小和动态数量的卡(带有ImageIcons的JButton)。我目前正在使用FlowLayout来使这些卡看起来很好,但是如果卡太多,它们将开始在底部消失。

我想写的一个优雅的解决方案包括将所有卡都排成一行,并仅根据数量计算卡之间的距离,以使它们均匀分布在面板中。如果有很多卡,它们会重叠,可以使用JLayeredPane彻底解决。现在,我并没有真正走到那里,但是如果您有解决方案,我将非常感激。

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

SSCCE:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ScrollPaneTest {

    public static void main(String[] args) {
        new ScrollPaneTest().init();
    }

    public void init() {

        JFrame frame = new JFrame();

        JPanel panel2 = new JPanel();
        JPanel panel = new JPanel();

        panel.setPreferredSize(new Dimension(200, 100));
        panel.setBackground(Color.GREEN);
        panel.setLayout(new FlowLayout());

        for (int i = 0; i < 15; i++) {
            panel.add(new JButton("Hi :)"));
        }

        JScrollPane scroll = new JScrollPane(panel);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        scroll.add(panel);

        panel2.add(panel, BorderLayout.WEST);

        frame.getContentPane().add(panel2, BorderLayout.NORTH);
        frame.setVisible(true);
        frame.pack();

    }
}

谢谢。

1 个答案:

答案 0 :(得分:1)

JScrollPane scroll = new JScrollPane(panel);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.add(panel);
panel2.add(panel, BorderLayout.WEST);

这不是您使用JScrollPane的方式。 4行代码中的每行的注释:

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

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

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

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

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

panel2.add(scroll, BorderLayout.WEST);