在具有固定大小的 JPanel 中显示未知数量的 JButton
Showing an unknown amount of JButtons in a JPanel with a fixed size
所以我正在做一个小的 Uno 游戏,而 Swing 似乎很喜欢踢我的屁股。我遇到的问题是当玩家看到并选择放下他的牌时。我有一个固定大小的给定面板和动态数量的卡片(带有 ImageIcons 的 JButtons)。我目前正在使用 FlowLayout 使这些卡片看起来很好,但如果卡片太多,它们就会开始在底部消失。
我想写的优雅解决方案是让所有卡片都排成一行,然后根据数量计算卡片之间的距离,以便它们在面板中均匀分布。如果有很多卡片,它们会重叠,这可以用 JLayeredPane 彻底解决。现在,我并没有真正走到那一步,但如果你有解决方案,我将不胜感激。
现在第二个也是更重要的问题可能是我没有意识到我犯了一些愚蠢的错误。在这一点上,我很高兴卡片在底部消失,只有滚动条向下滚动和 select 那些,但这似乎也不起作用。
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();
}
}
提前致谢。
JScrollPane scroll = new JScrollPane(panel);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.add(panel);
panel2.add(panel, BorderLayout.WEST);
这不是您使用 JScrollPane 的方式。 4 行代码的注释:
第一行是正确的。这将创建一个 JScrollPane 并将面板添加到滚动窗格的视口。
您不需要设置滚动条策略。如果需要,滚动条会自动出现。
不要将组件直接添加到滚动窗格。组件需要添加到滚动窗格的JViewport
(在第一行代码中为您完成)
不要将 "panel" 添加到另一个面板。一个 Swing 组件只能有一个父组件。该语句将从滚动窗格中删除 "panel"
相反,您需要将滚动窗格添加到父面板:
panel2.add(scroll, BorderLayout.WEST);
所以我正在做一个小的 Uno 游戏,而 Swing 似乎很喜欢踢我的屁股。我遇到的问题是当玩家看到并选择放下他的牌时。我有一个固定大小的给定面板和动态数量的卡片(带有 ImageIcons 的 JButtons)。我目前正在使用 FlowLayout 使这些卡片看起来很好,但如果卡片太多,它们就会开始在底部消失。
我想写的优雅解决方案是让所有卡片都排成一行,然后根据数量计算卡片之间的距离,以便它们在面板中均匀分布。如果有很多卡片,它们会重叠,这可以用 JLayeredPane 彻底解决。现在,我并没有真正走到那一步,但如果你有解决方案,我将不胜感激。
现在第二个也是更重要的问题可能是我没有意识到我犯了一些愚蠢的错误。在这一点上,我很高兴卡片在底部消失,只有滚动条向下滚动和 select 那些,但这似乎也不起作用。
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();
}
}
提前致谢。
JScrollPane scroll = new JScrollPane(panel);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scroll.add(panel);
panel2.add(panel, BorderLayout.WEST);
这不是您使用 JScrollPane 的方式。 4 行代码的注释:
第一行是正确的。这将创建一个 JScrollPane 并将面板添加到滚动窗格的视口。
您不需要设置滚动条策略。如果需要,滚动条会自动出现。
不要将组件直接添加到滚动窗格。组件需要添加到滚动窗格的
JViewport
(在第一行代码中为您完成)不要将 "panel" 添加到另一个面板。一个 Swing 组件只能有一个父组件。该语句将从滚动窗格中删除 "panel"
相反,您需要将滚动窗格添加到父面板:
panel2.add(scroll, BorderLayout.WEST);