我正在尝试渲染一个自定义Swing组件,我扩展了JComponent类.
为了简化组件需求,我们只需将我的组件汇总为需要渲染一些字符串,每个字符串都有自己的字体.
我需要将我的组件的大小精确到我渲染的字符串的总宽度和高度.
为了确定这个大小,我使用FontMetrics来计算每个字符串的尺寸.有了这些信息,我可以弄清楚我的组件的大小,并适当调整大小.
问题是,当我访问getGraphics()时,它总是为null,所以我无法得到FontMetrics实例.如果我等待从覆盖的paintComponent()方法计算我的组件大小,它已经太晚了(组件已经有一个大小,对吧?).
文档说"如果此组件当前不可显示,则此方法将返回null".那么我何时知道组件何时可以显示并且有一个Graphics对象供我调整组件大小?
一旦调用frame setVisible(true)框架,渲染组件的Swing调用顺序是什么?
谢谢
更新:2010年2月6日星期二23:34
正如评论中所提到的,GridLayout根本不尊重任何setXxxSize().对于任何感兴趣的人,我发布了使用GridLayout,BoxLayout和FlowLayout的结果,使用一个简单的框架,接收5个固定大小的200宽50高的组件(通过设置min,max和preferred).
检测结果:
所述的GridLayout总是沿宽度和高度调整大小(如在评论中提到)
无论如何,FlowLayout始终尊重组件大小.
至于BoxLayout ......
的PAGE_AXIS和Y_AXIS收缩的部件的宽度的大约一半它们的大小(104),但没有收缩的高度.
该LINE_AXIS和X_AXIS萎缩的组件,以什么似乎为零,但没有触及宽度高度.
首先,您可以使用TextLayout类及其相关内容来测量您的字符串.例如
public static void main(final String[] args) throws Exception
{
final FontRenderContext frc = new FontRenderContext(null, true, true);
final Font font = new Font("serif", Font.PLAIN, 18);
final TextLayout layout = new TextLayout("This is a test", font, frc);
final Rectangle2D bounds = layout.getBounds();
System.err.println((int) (bounds.getWidth() + .5));
}
Run Code Online (Sandbox Code Playgroud)
其次,通过使用ComponentListener可以在组件变得可见时通知您,但这不是在"提前"测量字符串所必需的!
| 归档时间: |
|
| 查看次数: |
2915 次 |
| 最近记录: |