当前位置: 首页 > 知识库问答 >
问题:

Java Swing:无法使用GridBagLayout在整个JPanel中传播组件

赵飞语
2023-03-14

我正在尝试实现一个简单的JDialog,其中上部的JPanel有一个GridBagLayout,它由5对JLabel组成:在每对JLabel中,第一个JLabel充当一个头,而第二个JLabel包含从web服务调用接收到的数据。这里有一个例子:

正如你所看到的,这个窗口太“空”了,空间太大了。首先,我不能理解为什么上面板比第二面板大得多。实际上,标题为“risultato”的JPanel也有GridBagLayout,第一个面板位于第0列和第0行,第二个面板位于第0列和第1行。

然后,对于每个JLabel,我调用以下方法:setMinimumSize(新维度(231,25))setPreferredSize(新维度(231,25))setMaximumSize(新维度(231,25))

此外,我为与每个JLabel关联的每个GridBagConstraints设置锚,如下所示:

  • GridBagConstraints.first_line_start用于红色;
  • GridBagConstraints.Center表示绿色;
  • GridBagConstraints.line_start用于橙色;
  • GridBagConstraints.Line_End用于黄色;
  • GridBagConstraints.last_line_start用于蓝色;
  • GridBagConstraints.last_line_end用于白色;

最后,我还为每个约束调用setWeightX(1.0);。我不知道为什么会有这样的效果,也不知道为什么在所有jlabel之前和之后都有那么多的空白处。有办法修好吗?所以上面板能适应所有部件?我无法编写任何Java代码,因为我的开发团队被迫使用奇怪的内部框架,我们通过编写一个xml文件来构建布局,其中每个标记都是一个容器或一个具有适当嵌套程度的组件,然后通过反射API实例化和调用真正的Java类和方法。反正机制应该是一样的。

更新

多亏了Kevin Anderson和我,我才得以大大改进了JDialog的布局。此外,我为上面板容器上的GridBagConstraints调用了SetWeighty(0.0),这样它也不会变得太大,并将其大小调整为包含的组件。

共有1个答案

黄飞翮
2023-03-14

您的标签在两列中,它们都具有相等的weightX,因此GridBagLayout为两列分配的宽度大致相等。但是如果给第二列中的标签赋予更大的权重x(例如10.0),则使第二列占用的空间相对比第一列大得多。列之间的空间会减少,而面板最右侧的空间会增加。

 类似资料:
  • 我的Java Swing GUI有问题。首先,我创建了一个带有GridBagLayout的面板,并将所有标签添加到其中。然而,我还在另一个JPanel的右侧创建了一个面板,其中添加了一个按钮和两个滑块,它们应该与标签匹配。 问题是JLabels比另一个面板右侧的组件小,这使得它看起来像这样...... 例如,水选项——JSLIDER(JSLIDER看起来要大得多) 我试图通过将添加到更大的值来使组

  • 任何帮助都是非常感谢的!

  • 我很好奇,在放置组件时,如何使用miglaway在网格上均匀分布组件: 例如,如果我在一个按钮组中放置四个JRadioButton以跨越3行2列(2,3),然后放置三个JButton,则分布的权重是不相等的,我最终会得到以下结果: 如图所示,A和B的大小相同,C保留剩余的空间:我希望A、B、C在垂直方向上等于三分之一。 如果这在GridBagLayout中是可能的,我也可以利用它,但是我在任何一种

  • 我想减少GridBagLayout中JTextField和JScrollPane的宽度和高度,但似乎通过设置文本字段列,宽度只能减少到JList中最长内容的长度。我不确定是否需要调整组件的两个或一个尺寸以匹配宽度。 我尝试了setPreferredSize()、setSize()和在文本字段上设置列长度,但它们似乎没有任何作用。

  • 我基本上一直在尝试通过使用JFrame并切换出2个JPanel(一个用于菜单,一个用于实际游戏)来为游戏制作菜单。我正在尝试实现我能想到的最基本的格式,但似乎无法让它工作。如果有人能解释代码的错误,我将不胜感激。 这是我的JFrame、菜单面板和ActionListener actionPerformed调用在此类中创建的面板 同样,如果有人能向我解释一下这段代码的错误,我将不胜感激。谢谢

  • 我正在使用开发一个Spring Boot项目,最近我添加了来为每个请求添加traceId。但是,当作业被系统自动触发时,它不能像在控制器或服务中调用action时那样传播traceId。我是否必须自定义sleuth日志记录或其他东西来将traceId传播到其他服务? 示例:当我通常调用controller时,sleuth工作良好,并且我已经将traceId传播到其他服务 但是,当我的作业被自动触发