【问题标题】:Lightest-weight spacer component in a GridBagLayoutGridBagLayout 中最轻的间隔组件
【发布时间】:2009-06-01 15:25:09
【问题描述】:

在 GridBagLayout 中,哪个组件最适合在面板中提供空白空间?理想情况下,我想使用一个组件:

  1. 低开销
  2. 不需要空白空间时没有副作用(即没有最小尺寸)
  3. 简单的构造函数(无参数)

JPanel 违反了上面的#2。 Box 需要一个构造函数参数(上面的#3),在这种简单的情况下,这实际上是不必要的。 JLabel 运行良好,但我担心它可能会产生一些开销,尽管不可否认它可能非常低。

匿名类似乎也能很好地工作(即“new JComponent() { }”),但是每次我使用它时都会添加一个额外的 .class 文件。我想它不会比任何给定的事件处理程序更多的开销。是否值得为此创建一个从 JComponent 派生的自定义、零实现组件?是否有我缺少的现有组件?

仅供参考 GridBagLayout 是我对我所在团队的限制之一,因此不能选择其他布局。

【问题讨论】:

  • 我还尝试了一个从 Component(而不是 JComponent)派生的匿名类,这似乎也很有效。我有点担心将 AWT 组件放入 Swing GUI 中可能存在的一些兼容性问题(例如,缺少双缓冲),但它肯定看起来是一个非常轻量级的解决方案。
  • 组件应该没问题。 Canvas 不会,因为它会创建一个重量级的同行,尽管我相信最近在该领域有一些改进工作。

标签: java user-interface swing layout


【解决方案1】:

您提到了 Box,但它可以通过以下四个简单地返回组件的静态方法以“轻量级”方式使用。我一直在使用这些。它们在绘画方面是不可见的。在你的情况下,看起来胶水是要走的路。一个微不足道的构造函数(就像那是一件坏事!),低开销。不需要空间时的副作用完全取决于您如何布局网格包。

panel.add( Box.createHorizontalGlue() );
panel.add( Box.createVerticalGlue() );
panel.add( Box.createHorizontalStrut( int width ) );
panel.add( Box.createVerticalStrut( int width ) );

此处为 JavaDoc:http://java.sun.com/javase/6/docs/api/javax/swing/Box.html

【讨论】:

  • 我非常喜欢这个解决方案。 “createGlue()”方法也适用于我的目的。我对此唯一的疑虑是它是为 BoxLayouts 设计的,但我会努力克服它,不要那么挑剔。 :) 感谢您的回答!
  • 无需疑虑 - 来自 JavaDoc:“Box 提供了几个类方法,这些方法对使用 BoxLayout 的容器非常有用——甚至是非 Box 容器。”
  • 请注意,链接的文档建议不要使用支柱,以支持刚性区域,用于固定尺寸。 (除了刚性区域,使用胶水来制作可生长的垫片,并使用自定义 Box.Filler 来控制最大/最小/首选尺寸。)
  • 在 JPanel/GridLayout 中使用垂直粘合会破坏某些组件的大小(标题边框不再水平扩展)。
猜你喜欢
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2013-02-22
  • 2018-01-13
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多