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