0

我正在尝试将 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)

我得到的屏幕是这样的:

在此处输入图像描述

此外,奇怪的是,当我调整屏幕大小时,我看到了这个:

在此处输入图像描述

好像整个图表都大大缩小了......有什么想法可以解决这个问题吗?非常感谢提前

4

4 回答 4

2

每当 GridBagLayout 缩小到布局无法容纳组件的首选尺寸时,它会立即使用每个组件的最小尺寸。这具有令人讨厌的效果,使所有东西都立即变得很小。(最常见的是 JTextFields,其最小宽度仅为几个像素。)

幸运的是,这很容易解决:只需将每个组件的最小尺寸设置为其首选尺寸。例如:

chartPanel.setMinimumSize(chartPanel.getPreferredSize())

现在,开始使用 weightx。GridBagLayout 权重用于布局中的额外空间,因此您的标签的 weightx 应该为零。这仅仅意味着当布局大于所需的大小时(通常是因为用户通过调整框架大小使框架变大),他们将永远不会获得任何额外的空间。

当所有组件的权重为零时,任何额外的空间都简单地保留在边缘,导致整个布局居中。这就是您在布局的垂直轴上看到的内容。为每一行赋予相同的正值weighty,行将拉伸以垂直填充窗口。

(旁注:权重不需要加到 1,因为它们是相对的。所以你可以只weighty = 1为每个图表行做,而让所有其他行的 aweighty为零。)

于 2013-05-09T11:37:44.367 回答
2

你可以用这个frame.setResizable(false);

于 2013-05-09T11:02:11.377 回答
1

这通常是因为可用空间小于组件的首选大小(这种情况经常发生JTextField

您也可以尝试返回最小尺寸。

于 2013-05-09T11:15:42.117 回答
1

为什么不给标签“他们需要的宽度”和图表“其余的”?

这可以使用 a 中的单列GridLayout标签来完成。将图表放入.LINE_STARTBorderLayoutCENTER

于 2013-05-09T11:01:51.917 回答