Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让JLabel准确预测其宽度?_Java_Swing_Components_Awt_Jlabel - Fatal编程技术网

Java 如何让JLabel准确预测其宽度?

Java 如何让JLabel准确预测其宽度?,java,swing,components,awt,jlabel,Java,Swing,Components,Awt,Jlabel,我遇到这样一种情况:用户输入一个字符串,我的代码为其创建一个Jlabel,并尝试将其置于全屏JFrame/窗格的中心。我的问题是,为了能够准确地将它居中,我需要知道它的尺寸 我需要一种方法来计算JLabel应该有多长(宽),这样它就可以容纳字符串的长度了。我尝试使用组件拥有的preferredSize()方法,结果看起来很糟糕(我传递了一个null值,让我的UI确定preferredSize)。我知道如何计算出有效的高度(fontSize+10px的大小通常很好),但我无法得到宽度 我使用的是绝

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

我需要一种方法来计算JLabel应该有多长(宽),这样它就可以容纳字符串的长度了。我尝试使用组件拥有的preferredSize()方法,结果看起来很糟糕(我传递了一个null值,让我的UI确定preferredSize)。我知道如何计算出有效的高度(fontSize+10px的大小通常很好),但我无法得到宽度

我使用的是绝对定位(无布局管理器)


谢谢

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

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

您将使用
FontMetrics

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

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


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

通过使用一些复选框,听起来您应该使用布局管理器来实现此功能。不幸的是,对于我目前的解决方案,这是不可能的。LayoutManager以特定的方式执行,因此必须能够实现。您始终可以使用布局管理器(或使用不同布局管理器的嵌套面板)。使用首选大小确定组件位置的事实正是布局管理器在定义良好的API中所做的。如果由于某种原因,没有一个布局管理器执行您想要的操作,那么您可以编写自己的布局管理器(这就是您现在正在执行的操作)。没有必要使用绝对定位,除非你有一个应用程序可以将组件拖动到面板上的任意位置。我刚刚试过,它似乎可以工作。我将更有力地测试它,并让您知道结果如何。这很奇怪,但当我设置preferredSize()时,它的宽度不正确。。。oddI最终使用了这个解决方案(尽管另一个解决方案同样正确和良好),因为它占用了大量的行。谢谢@chrisalth虽然我可能已经找到了我的修复方法(没有药物双关语),但我很想看看这段代码。我不知道你能做到这一点,谢谢你的代码。我正在测试这个,它是有效的。现在,我有两个有效且优雅的解决方案,只有一个可接受的答案。@user,
:)
接受您在代码中使用的答案。如果不是我的,不用担心。