【问题标题】:How do I get a JLabel to accurately predict how wide it should be?如何让 JLabel 准确预测它应该有多宽?
【发布时间】:2011-09-10 02:17:44
【问题描述】:

我有一种情况,用户输入一个字符串,我的代码为它创建了一个 Jlabel,并尝试将它置于全屏 JFrame/Pane 的中心。我的问题是,为了能够准确地居中,我需要知道它的尺寸。

我需要一种方法来确定 JLabel 应该有多长(宽),以便它适应字符串的长度,仅此而已。我尝试使用组件具有的preferredSize() 方法,它看起来很糟糕(我传递了一个空值让我的UI 确定preferredSize)。我知道如何计算出有效的高度(fontSize + 10px 的大小通常很好),但我无法得到宽度。

我使用的是绝对定位(没有 LayoutManager)。

谢谢

【问题讨论】:

  • 听起来您应该为此使用 LayoutManager。
  • 不幸的是,对于我目前的解决方案,这是不可能的。 LayoutManagers是按照一定的方式做的,所以一定是可以实现的。
  • 您始终可以使用布局管理器(或使用不同的布局管理器嵌套面板)。您使用首选大小来确定组件位置的事实正是布局管理器在定义良好的 API 中所做的事情。如果由于某种原因没有一个布局管理器可以执行您想要的操作,那么您可以编写自己的布局管理器(这就是您现在正在做的事情)。不需要使用绝对定位,除非您有一个应用程序可以将组件拖动到面板上的随机位置。

标签: java swing components awt jlabel


【解决方案1】:

如果您没有事先设置,我相信实际宽度来自getPreferredSize().getWidth()。尝试输出首选大小而不将其设置为 null。使用 MigLayout 将组件居中时,我通常使用pref! 使组件对于所有尺寸都尽可能小并避免包裹,然后将其居中在宽敞的父容器中。

【讨论】:

  • 我刚试过,它似乎工作。我将对其进行更稳健的测试,并让您知道结果如何。它的工作原理很奇怪,但是当我设置 preferredSize() 时,它没有得到正确的宽度......奇怪
  • 我最终使用了这个解决方案(即使另一个同样正确和好),因为它占用了很多行。谢谢@Chris
【解决方案2】:

如果您已经使用字体height + 10 表示高度,您可以轻松地使用字符串width + x

你将使用FontMetrics:

Graphics g;
FontMetrics met = g.getFontMetrics();
int height = met.getHeight();
int width = met.stringWidth(label.getText());

【讨论】:

  • 虽然我可能已经找到了我的解决方法(无意使用双关语),但我很想看到这段代码。
  • 我不知道你能做到这一点,谢谢你的代码。我对此进行了测试,并且可以正常工作。所以现在,我有两个可行且优雅的解决方案,只有一个可以接受的答案要给出。
  • @user, :) 接受您最终在代码中使用的任何一个。如果它不是我的,请不要担心。
【解决方案3】:

【讨论】:

    【解决方案4】:

    我强烈建议为您的 GUI 使用 LayoutManager。不知道为什么要使用绝对定位,但这是它导致的问题的一个完美例子。

    FlowLayout 具有简单的居中功能,许多其他布局管理器也支持居中。

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 2020-01-21
      • 2019-08-20
      • 2012-01-03
      • 2016-06-03
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2018-09-20
      相关资源
      最近更新 更多