我最近一直在开发Swing应用程序.我遇到了布局管理器的问题.我似乎无法弄清楚如何使布局中的组件一直增长到其父容器的边缘.让我解释.
假设我在一行中有8个按钮.根据窗口大小将确定它们是否占用了所有空间.GBL我找到了中心左右两侧的空间.BoxLayout通常在右侧空间.这可能是由于他们的锚点或对齐.
我认为问题是因为当所有组件具有相同的设置时,它会尝试为每个组件提供相同的空间.因此,不能将多余的空间平均分配给他们将其遗漏的每个组件.
我想知道是否有一个解决方案.就像空间那么小,我希望有一种方法可以让最后一个组件吃掉它或者在组件之间将它分开.
以下是显示问题的示例代码.请注意,当您调整面板大小时,您将获得额外的空间.
public class LeftoverExample {
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
LeftoverExample.createGUI();
}
});
}
public static void createGUI(){
JFrame jF = new JFrame();
jF.setSize(new Dimension(1333,500));
jF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create ContentPane
JPanel contentPane = new JPanel();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.X_AXIS));
GridBagLayout gBL = new GridBagLayout();
gBL.columnWidths = new int[]{0};
gBL.rowHeights = new int[]{50, 50, 50 , 50};
contentPane.setLayout(gBL);
//Initial Constraints
GridBagConstraints gBC = new GridBagConstraints();
gBC.fill = GridBagConstraints.BOTH;
gBC.gridx = 0;
gBC.gridy = 0;
gBC.weightx …Run Code Online (Sandbox Code Playgroud) 背景:在 Swing 中制作游戏。这是简单的回合基础游戏。不是很多事情发生。因此,我认为我不需要实现 Game Tick。相反,我的想法是当一个组件被更改或需要更新时,只需简单地重新验证/重新绘制该组件,而不是重新绘制整个屏幕。
我有一个 GameJPanel,它目前包含所有组件。这个 JPanel 是包含重新验证/重新绘制等组件的组件。我想我可以制作包含 GameJPanel 和我的 OptionJPanel 的 JLayeredPane。在 GameJPanel 上有一个按钮,当按下它时会导致 OptionJPanel 显示在它的顶部,并且它的 JPanel 50% 透明(因此它会影响它使 GameJPanel 变暗)。
然而,一旦我这样做了,发生的事情就是 GameJPanel 开始替换 OptionJPanel 组件(因为事件......等;重新绘制组件)。
所以目前我不知道该怎么做。我在想,如果我有某种游戏标记,我就不会遇到这个问题,但是,我不是 100% 确定。我有点担心如果我实现了游戏中的事件会导致 GameJPanel 组件显示半秒然后被替换的游戏。有一些事件会导致组件无需手动重新绘制(例如 JLabel setText(); 的快速示例)
我尝试过使用 CardLayout 但我无法弄清楚如何在后台看到 GameJPanel 时让 OptionJPanel 位于 GameJPanel 之上(我尝试设置背景颜色 setOpaque(false)...,试图限制 Option JPanel 大小但我认为 CardLayout 会拉伸它(不是 100% 确定))这样做时我得到的只是灰色背景。
我不想走 CardLayout 路线,因为将来我还计划将组件放在 GameJPanel 的顶部(比如有人单击按钮,在不同层上有另一个面板有一个组件滑入或滑出等)。我大量使用 CardLayout 和 GameJPanel 中的其他组件来交换屏幕,但不需要让其他组件在显示的后面显示出来。
关于如何解决这个问题的任何想法都是很好的,甚至是显示这一点的示例代码。