繁体   English   中英

GridBagLayout-图表和标签的放置

[英]GridBagLayout - placement of chart and labels

我试图将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)

我得到的屏幕是这样的:

在此处输入图片说明

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

在此处输入图片说明

好像整个图表都缩水了……有什么想法可以解决这个问题吗? 提前谢谢

您可以使用此frame.setResizable(false);

每当GridBagLayout缩小到无法容纳组件的首选大小的程度时,它就会立即使用每个组件的最小大小。 这具有使所有内容立即变小的烦人的效果。 (最常见的情况是JTextFields,其最小宽度仅为几个像素。)

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

chartPanel.setMinimumSize(chartPanel.getPreferredSize())

现在,继续使用weightx。 GridBagLayout权重用于布局中的额外空间,因此标签的权重应为零。 这只是意味着,当布局大于所需的大小时,将永远不会给它们任何额外的空间(通常是因为用户通过调整框架的大小来增大框架的大小)。

当所有组件的权重均为零时,任何多余的空间都会简单地保留在边缘上,从而使整个布局居中。 那就是在布局的垂直轴上看到的。 给每行相同的正权weighty值,行将拉伸以垂直填充窗口。

(旁注:权重不需要相加,因为权重相对于彼此是1。因此,您可以为每个图表行都设置weighty = 1weighty = 1所有其他行的权weighty为零。)

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

这可以通过在BorderLayoutLINE_START中使用标签的单列GridLayout来完成。 将图表放在CENTER

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM