2011-06-15 58 views
1

我已经实现了自定义JPanel,其绘制方法已扩展为在全屏模式下执行大量手动渲染。现在我想集成另一个JComponent到这个(在我的情况下,一个JPanel,其中包含一个JScrollpaneJTextPane作为它的视口)应该出现在我的第一个面板的顶部,但因为我的自定义渲染管道很复杂,因此将JComponent添加到我的面板和它通过AWT系统绘制传统方式不是一种选择(我试过了,它最好是古怪的,最坏的情况下不是功能),所以我的问题是:是否可以手动命令JComponent涂上一个指向我的程序通过调用其常规绘画方法,而不绑定到JContainer,如果是的话,我该怎么做?绘制JComponent而不将其添加到容器

在此先感谢您的答案。

+0

N.B.如果您无法使用已提供的建议进行工作,我建议您发布尽力而为的[SSCCE](http://pscode.org/sscce.html)。 – 2011-06-15 16:49:05

回答

2

是的,只需在对象上调用普通的绘画方法,并传递想要绘制的图形。然而,这只是描绘它,听起来像你希望它可能滚动,这意味着你将需要将它添加到您的自定义JPanel。在这种情况下,只需添加面板和布局管理器,即可将组件放置在您需要的位置。

+0

感谢您的回复,但这不起作用。我在我的JPanel的paint方法内调用JComponent的paint方法(并将Graphics对象传递给它),但未呈现JComponent。它会在我将它添加到面板时渲染,但正如我解释的那样,我不想那样做,因为结果是非常不理想的,至少可以说。 – Tamori 2011-06-15 15:07:25

+0

在面板中进行其他绘画之后,您是否绘画过它? – jzd 2011-06-15 15:10:20

+0

在我的程序中,它应该在我的渲染管道中间的某处绘制,但出于测试目的,我试图在绘制方法结束时添加它,但它不起作用。在将它传递给JComponent的paint方法之前,我还确保将Graphics2D对象的所有变换,颜色,笔画等重置。 – Tamori 2011-06-15 15:23:44

2

您应该为组件设置大小。然后定位它使用图形的translate(x,y)将组件定位到所需的点。

+0

组件的大小设置为初始化。但是当我调用paint方法时,组件不显示。 – Tamori 2011-06-15 15:09:15

0

如果层次结构中的任何容器更高的水平,你可以使用

validate(); repaint(); 

对来做到这一点。

如果不是,您可以在最后更改其大小或范围(如+1,-1)以使其自身重新绘制。

3

请参阅this thread上的LabelRenderTest.java来源。标签最终被绘制到屏幕上,但在被显示之前它被绘制到BufferedImage

来源的重要行是..

textLabel.setSize(textLabel.getPreferredSize()); 
+0

还要考虑'RenderingHints.VALUE_ANTIALIAS_ON'。 – trashgod 2011-06-15 19:58:52

+0

@trashgod:是否自动为“JLabel”启用了抗锯齿功能?还是你指的是'BufferedImage'的渲染?我不会认为它在那个阶段是相关的。 – 2011-06-15 20:05:47

+0

在任何绘画之前,应该在'createGraphics()'返回的上下文中设置提示。方便地,'createGraphics()'返回一个'Graphics2D'对象,并且它应该在完成时得到'dispose()'。 – trashgod 2011-06-15 20:33:27

3

你可以看看的CellRendererPane,看看例如BasicTableUI油漆与它的分量图像。

+0

欢迎你在这个论坛btw +1 – mKorbel 2011-06-15 15:19:59

相关问题