Java 在getPreferredSize()之后调用Paint()
我想显示带有自定义标题渲染器(旋转的两行文本)的JTable。Java 在getPreferredSize()之后调用Paint(),java,swing,Java,Swing,我想显示带有自定义标题渲染器(旋转的两行文本)的JTable。 用于设置自定义渲染器的伪代码: table.getColumnModel().getColumn(0..colCount).setHeaderRenderer(new TableCellHeaderRendererGraphics()); 类TableCellHeaderRenderGraphics扩展了DefaultTableCellRenderer 这里覆盖了方法paint(Graphics g)和getPreferredSi
用于设置自定义渲染器的伪代码:
table.getColumnModel().getColumn(0..colCount).setHeaderRenderer(new TableCellHeaderRendererGraphics());
类TableCellHeaderRenderGraphics
扩展了DefaultTableCellRenderer
这里覆盖了方法paint(Graphics g)
和getPreferredSize()
。在paint
中,我使用文本、字体、图形2D和仿射变换来旋转文本,并以粗体和素色显示两行。问题是在
绘制(图形g)
之前调用了getPreferredSize()
问:在我有机会使用仅在
paint()
中引用的图形计算尺寸之前,如何返回首选尺寸?
我能够回答自己的问题:
在没有Graphics
上下文的情况下,可以计算所需矩形的大小。使用组件(JLabel
在本例中)方法getFontMetrics()
在此类中,使用stringWidth(txt)
获取文本的宽度
文本的高度可以通过getFontMetrics().getHeight(),.getAscent(),.getDescent()
请求。您不能:p,API就是这样工作的。您可以直接向组件询问FontMetrics
是否有效我认为我可以在这里看到设计缺陷-绘制时计算组件大小??当你要画画的时候,你应该已经知道你要画什么,所以你必须知道所有的界限。为什么不使用专用的方法来计算这些任务的大小,比如get*size()。您可以始终实现自己的布局管理器,只针对这一个组件。@MadProgrammer:thx,我想我会在收到您的提示后让它工作。第一次测试给了我希望。JLabel FontMetrics可以在没有图形的情况下计算文本长度2d,高度可以是固定值-这对我很有用。@Antoniosss:我知道画什么(两行文本)。我也知道课文的内容。但我似乎需要一个图形上下文来计算像素大小。如何在没有图形上下文的情况下计算给定文本的高度?布局管理器:我在“Java教程”中找到了“创建自定义布局管理器”。这是了解更多这方面的好起点吗?你不需要。就像前面提到的@MadProgrammer一样,使用FontMetrics