所以我正在做一个小的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();
}
}
谢谢。
答案 0 :(得分:1)
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);