我正在尝试将一个JfreeChart和一些标签放在gridBagLayout上。我希望图表位于右侧,水平和垂直占据框架的所有空间,并跨越框架宽度的90%。标签应位于相同大小的单元格中,位于左侧图表,每个占据了10%的高度和33%的高度。到目前为止代码看起来像这样:
val chartPanel = new ChartPanel(chart, true, true, true, true, true)
//layout
setLayout(new GridBagLayout())
val c = new GridBagConstraints()
//natural height, maximum width
c.fill = GridBagConstraints.BOTH
c.gridx = 1
c.gridy = 0
c.weightx = 0.9
add(chartPanel, c)
val label = new JLabel("Count: ")
val c2 = new GridBagConstraints()
c2.fill = GridBagConstraints.VERTICAL
c2.gridx = 0
c2.gridy = 0
c2.weightx = 0.1
add(label, c2)
val label2 = new JLabel("Count2: ")
val c3 = new GridBagConstraints()
c3.fill = GridBagConstraints.VERTICAL
c3.gridx = 0
c3.gridy = 1
c3.weightx = 0.1
add(label2, c3)
val label3 = new JLabel("Count3: ")
val c4 = new GridBagConstraints()
c4.fill = GridBagConstraints.VERTICAL
c4.gridx = 0
c4.gridy = 2
c4.weightx = 0.1
add(label3, c4)
我得到的屏幕是:
此外,bizzarly,当我调整屏幕大小时,我看到了这一点:
好像整个图表大幅缩水......任何想法如何解决这个问题?非常感谢提前
答案 0 :(得分:2)
您可以使用此frame.setResizable(false);
答案 1 :(得分:2)
每当GridBagLayout缩小到布局无法容纳组件的首选大小时,它会立即使用每个组件的最小大小。这有令人烦恼的效果,使一切变得瞬间微小。 (最常见的是JTextFields,其最小宽度只有几个像素。)
幸运的是,它很容易解决:只需将每个组件的最小大小设置为其首选大小即可。例如:
chartPanel.setMinimumSize(chartPanel.getPreferredSize())
现在,您使用weightx。 GridBagLayout权重用于布局中的 extra 空间,因此您的标签的权重x应为零。这仅仅意味着当布局大于它需要时,它们永远不会被给予任何额外的空间(通常是因为用户通过调整大小来使框架更大)。
当所有组件的权重都为零时,任何额外的空间都会保留在边缘上,从而使整个布局居中。这就是您在布局的垂直轴上看到的内容。为每一行赋予相同的正weighty
值,并且行将拉伸以垂直填充窗口。
(附注:权重不需要加起来为1,因为它们彼此相对。所以你可以为每个图表行做weighty = 1
,并保留所有其他行{{1零。)
答案 2 :(得分:1)
为什么不给标签'他们需要的宽度'和图表'其余'?
可以使用GridLayout
的{{1}}中的一列LINE_START
标记来完成。将图表放在BorderLayout
。
答案 3 :(得分:1)
这通常是因为可用空间小于组件首选大小(这种情况很快发生在JTextField
)
您也可以尝试返回最小尺寸。