如何让JLabel准确预测应该有多宽?

问题描述:

我有一种情况,用户输入一个字符串,我的代码为它制作一个Jlabel,并试图将它集中到一个全屏JFrame/Pane上。我的问题是,为了能够准确地居中,我需要知道它的尺寸。如何让JLabel准确预测应该有多宽?

我需要一种方法来确定JLabel应该有多长(宽),以便它可以容纳字符串的长度,而不再是更多。我尝试使用组件拥有的preferredSize()方法,它看起来很可怕(我传递了一个空值来让我的UI确定preferredSize)。我知道如何确定工作的高度(fontSize + 10px的大小通常很好),但我无法获得宽度。

我正在使用绝对定位(没有LayoutManager)。

感谢

+3

这听起来像你应该使用这个布局管理的。 – Jonas 2011-06-07 13:38:17

+1

不幸的是,对于我当前的解决方案来说这是不可能的。 LayoutManagers以某种方式执行此操作,因此它必须可以实现。 – user83643 2011-06-07 13:39:47

+0

您可以随时使用布局管理器(或嵌套使用不同布局管理器的面板)。事实上,使用首选大小来确定组件的位置正是布局管理器在定义良好的API中所做的工作。如果由于某种原因布局经理没有做你想做的事情,那么你可以编写自己的布局管理器(这就是你现在正在做的)。没有必要使用绝对定位,除非您有将应用程序拖放到面板上随机位置的应用程序。 – camickr 2011-06-07 14:48:34

我相信实际宽度来自getPreferredSize().getWidth(),如果你不把它提前。尝试输出首选大小而不将其设置为空。使用MigLayout对中元件时,我通常使用pref!来使所有尺寸的元件尽可能小,并避免缠绕,然后将其居中放在宽敞的父容器中。

+1

我刚刚尝试过,它似乎工作。我会更强大地测试它,并让你知道它是如何产生的。这是奇怪的如何工作,但当我设置preferredSize()它没有得到正确的宽度...奇怪 – user83643 2011-06-07 13:44:57

+1

我可以证实这个工程,感谢您的帮助。 – user83643 2011-06-07 13:48:41

+1

我最终使用这个解决方案(即使其他人同样正确和好),因为它占用的线数很多。谢谢@Chris – user83643 2011-06-07 13:52:09

如果您已经使用字体height + 10作为高度,则可以轻松使用字符串width + x

您将使用FontMetrics

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

尽管我可能找到了我的修复程序(没有任何药物双关键词),但我很想看到这段代码。 – user83643 2011-06-07 13:45:20

+0

@user,我已经添加了代码。 – jjnguy 2011-06-07 13:46:22

+0

我不知道你可以这样做,谢谢你的代码。我测试这个,它的工作原理。所以现在,我有两个工作和优雅的解决方案,只有一个可以接受的答案。 – user83643 2011-06-07 13:49:50

我使用布局管理你的GUI强烈暗示。不知道你为什么使用绝对定位,但这是它造成的问题的完美例子。

FlowLayout有一个简单的居中功能和许多其他布局管理器支持中心。