【问题标题】:GridBagLayout - placement of chart and labelsGridBagLayout - 图表和标签的放置
【发布时间】:2019-05-14 19:53:31
【问题描述】:

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

我得到的屏幕是这样的:

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

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

【问题讨论】:

  • val chartPanel...这是 Scala 吗?
  • 是的,使用 scala 应用中的 swing

标签: java swing user-interface jfreechart


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    chartPanel.setMinimumSize(chartPanel.getPreferredSize())
    

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

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

    (旁注:权重不需要加到 1,因为它们是相对的。所以您可以为每个图表行执行 weighty = 1,并将所有其他行的 weighty 保留为零.)

    【讨论】:

      【解决方案3】:

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

      这可以使用BorderLayoutLINE_START 中的单个标签GridLayout 来完成。将图表放入CENTER

      【讨论】:

      • 但是标签不会垂直扩展以占据屏幕的 33%,对吧?
      • ChartPanel 应该返回 PreferredSize,然后所有 LayoutManagers 都会接受这个 Dimension
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        • 2020-08-22
        • 1970-01-01
        相关资源
        最近更新 更多