如何让JLabel准确预测应该有多宽?
问题描述:
我有一种情况,用户输入一个字符串,我的代码为它制作一个Jlabel,并试图将它集中到一个全屏JFrame/Pane上。我的问题是,为了能够准确地居中,我需要知道它的尺寸。如何让JLabel准确预测应该有多宽?
我需要一种方法来确定JLabel应该有多长(宽),以便它可以容纳字符串的长度,而不再是更多。我尝试使用组件拥有的preferredSize()方法,它看起来很可怕(我传递了一个空值来让我的UI确定preferredSize)。我知道如何确定工作的高度(fontSize + 10px的大小通常很好),但我无法获得宽度。
我正在使用绝对定位(没有LayoutManager)。
感谢
答
我相信实际宽度来自getPreferredSize().getWidth()
,如果你不把它提前。尝试输出首选大小而不将其设置为空。使用MigLayout对中元件时,我通常使用pref!
来使所有尺寸的元件尽可能小,并避免缠绕,然后将其居中放在宽敞的父容器中。
答
如果您已经使用字体height + 10
作为高度,则可以轻松使用字符串width + x
。
您将使用FontMetrics
:
Graphics g;
FontMetrics met = g.getFontMetrics();
int height = met.getHeight();
int width = met.stringWidth(label.getText());
答
我使用布局管理你的GUI强烈暗示。不知道你为什么使用绝对定位,但这是它造成的问题的完美例子。
FlowLayout
有一个简单的居中功能和许多其他布局管理器支持中心。
这听起来像你应该使用这个布局管理的。 – Jonas 2011-06-07 13:38:17
不幸的是,对于我当前的解决方案来说这是不可能的。 LayoutManagers以某种方式执行此操作,因此它必须可以实现。 – user83643 2011-06-07 13:39:47
您可以随时使用布局管理器(或嵌套使用不同布局管理器的面板)。事实上,使用首选大小来确定组件的位置正是布局管理器在定义良好的API中所做的工作。如果由于某种原因布局经理没有做你想做的事情,那么你可以编写自己的布局管理器(这就是你现在正在做的)。没有必要使用绝对定位,除非您有将应用程序拖放到面板上随机位置的应用程序。 – camickr 2011-06-07 14:48:34