GridBagLayout - 图表和标签的放置

时间:2013-05-09 10:59:11

标签: java swing user-interface jfreechart

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

我得到的屏幕是:

enter image description here

此外,bizzarly,当我调整屏幕大小时,我看到了这一点:

enter image description here

好像整个图表大幅缩水......任何想法如何解决这个问题?非常感谢提前

4 个答案:

答案 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

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