如何为 GridBagLayout(或任何其他可以完成这项工作的布局)中的单元格设置动态宽度
How to set a dynamic width for the cells in a GridBagLayout (or any other Layout that can do the job)
我想从 ini 文件构建 GUI,以便非程序员可以在需要时更轻松地更改布局。
我可以添加 JPanel
容器和某些 Swing 组件,其中包含在文本文件中给出的关键字和参数,如下所示:
//new panel
JPanel "noborder"
alignleft
JLabel
text "Bias (V)"
JToggleButton
text "+/-"
JSpinner "bias"
alignleft
JLabel
text "V"
newline
alignleft
JLabel
text "Current Setpoint"
gridx "2"
JSpinner "setpoint"
alignleft
JLabel
text "nA"
newline
alignleft
JLabel
text "Feedback"
gridx "2"
JSpinner "feedback"
alignleft
JLabel
text "nm/s"
newline
alignleft
JLabel
text "Compensation"
gridx "2"
JSpinner "compensation"
我相信使用的语法非常简单,换行集 gridx = 0
、gridy++
、JLabel
/JSpinner
/JPanel
添加新组件到具有给定 GridBagConstraints
和增量 gridx
、...
的帧
面板被添加到 JFrame
,使用 GridBagLayout
frameGbc
在 Y 方向对齐,设置如下:
frameGbc = new GridBagConstraints();
frameGbc.gridx = 0;
frameGbc.gridy = 0;
frameGbc.anchor = GridBagConstraints.CENTER;
frameGbc.fill = GridBagConstraints.HORIZONTAL;
frameGbc.gridwidth = GridBagConstraints.REMAINDER;
添加面板后,gridy
增加 1。
当我添加组件时,它会添加到添加到框架的最后一个面板中。我可以通过我的 ini 文件设置 gridx
、gridy
、gridwidth
、gridheight
和锚点。
我目前使用的文件给出了以下布局:
你能看到的下半部分(从JLabel
开始,文本"Bias (V)")是由我上面提供的ini文件的部分设置的。
这些组件采用了它们需要的 space 并且面板明显居中。
我想做的是,为每个面板使用最宽的面板(最需要 space 的面板,这里:有 6 个按钮的面板)给出的全宽度,例如对于最后一个面板,程序会自动将一个单元格的宽度调整为最大宽度的四分之一,因为放置组件的最大值 gridx
是 gridx = 3
-->
cellwidth = maxwidth/4
或者更一般地说:
cellwidth = maxwidth / (highest occupied gridx +1)
我已经尝试了几个限制条件,并在几个小时内寻找类似的问题,因为我找不到其他有类似问题的人,我想解决方案必须非常简单或非常棘手。
我绝对想避免使用 weightx
、weighty
、ipadx
、ipady
、...因为 .ini 文件的语法应该尽可能简单。
so that e.g. for the last panel the program sizes the width of one cell automatically at a quarter of the max width
你不能那样做。这实际上就像说一个单元格的网格宽度应该为 1.5,这是行不通的。
一种解决方案可能是创建嵌套面板。嵌套面板的网格宽度可以为 6,以占据所有 6 个单元格的 space。然后添加到此面板的 4 个组件中的每一个将占用面板可用总数的 1/4 space。
我想从 ini 文件构建 GUI,以便非程序员可以在需要时更轻松地更改布局。
我可以添加 JPanel
容器和某些 Swing 组件,其中包含在文本文件中给出的关键字和参数,如下所示:
//new panel
JPanel "noborder"
alignleft
JLabel
text "Bias (V)"
JToggleButton
text "+/-"
JSpinner "bias"
alignleft
JLabel
text "V"
newline
alignleft
JLabel
text "Current Setpoint"
gridx "2"
JSpinner "setpoint"
alignleft
JLabel
text "nA"
newline
alignleft
JLabel
text "Feedback"
gridx "2"
JSpinner "feedback"
alignleft
JLabel
text "nm/s"
newline
alignleft
JLabel
text "Compensation"
gridx "2"
JSpinner "compensation"
我相信使用的语法非常简单,换行集 gridx = 0
、gridy++
、JLabel
/JSpinner
/JPanel
添加新组件到具有给定 GridBagConstraints
和增量 gridx
、...
面板被添加到 JFrame
,使用 GridBagLayout
frameGbc
在 Y 方向对齐,设置如下:
frameGbc = new GridBagConstraints();
frameGbc.gridx = 0;
frameGbc.gridy = 0;
frameGbc.anchor = GridBagConstraints.CENTER;
frameGbc.fill = GridBagConstraints.HORIZONTAL;
frameGbc.gridwidth = GridBagConstraints.REMAINDER;
添加面板后,gridy
增加 1。
当我添加组件时,它会添加到添加到框架的最后一个面板中。我可以通过我的 ini 文件设置 gridx
、gridy
、gridwidth
、gridheight
和锚点。
我目前使用的文件给出了以下布局:
你能看到的下半部分(从JLabel
开始,文本"Bias (V)")是由我上面提供的ini文件的部分设置的。
这些组件采用了它们需要的 space 并且面板明显居中。
我想做的是,为每个面板使用最宽的面板(最需要 space 的面板,这里:有 6 个按钮的面板)给出的全宽度,例如对于最后一个面板,程序会自动将一个单元格的宽度调整为最大宽度的四分之一,因为放置组件的最大值 gridx
是 gridx = 3
-->
cellwidth = maxwidth/4
或者更一般地说:
cellwidth = maxwidth / (highest occupied gridx +1)
我已经尝试了几个限制条件,并在几个小时内寻找类似的问题,因为我找不到其他有类似问题的人,我想解决方案必须非常简单或非常棘手。
我绝对想避免使用 weightx
、weighty
、ipadx
、ipady
、...因为 .ini 文件的语法应该尽可能简单。
so that e.g. for the last panel the program sizes the width of one cell automatically at a quarter of the max width
你不能那样做。这实际上就像说一个单元格的网格宽度应该为 1.5,这是行不通的。
一种解决方案可能是创建嵌套面板。嵌套面板的网格宽度可以为 6,以占据所有 6 个单元格的 space。然后添加到此面板的 4 个组件中的每一个将占用面板可用总数的 1/4 space。