2

我在这个里面绘制形状JPanel,它也在另一个 main 里面JPanel。在repaint()它只绘制形状一毫秒然后它们就消失了。他们不会一直画,为什么?

我的paintComponent方法是这样的

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    for (int i = 0; i < reportElements.size(); i++) {
        this.reportElements.get(i).display((Graphics2D) pageComponents.get(i).getGraphics());

    }
}

当父级启用时JEditorPanesetEditable()它可以工作并且我们可以看到形状,但是当它是 a 时JPanel,一毫秒后我看到的只是空面板。

4

4 回答 4

3

您应该绘制到 JPanel 的 Graphics 对象以使其永久存在...在您的示例中,这就是Graphics g...

于 2010-03-09T15:37:24.843 回答
2

超约翰已经死了。你需要使用Graphics你已经通过的。继续阅读为什么...

Java 1.6 引入了RepaintManager支持优化重绘请求的功能。它对绘画有一些微妙的影响。

在这种情况下,您正在使用多个 Graphics2D 对象:g传入的对象paintComponent和调用返回的值getGraphics

重绘管理器已将您交给您g要绘制的对象。注意:这不会在屏幕上绘制,而是在临时缓冲区(假设默认的双缓冲)上绘制。

在调用中,您正在绘制从各种组件中paintComponent获得的图形。getGraphics这是绕过重绘管理器并直接绘制到无缓冲显示。

paintChildren返回时,开始RepaintManager处理更新双缓冲区。它在显示的缓冲区上绘制空白临时缓冲区,有效地擦除通过从获得的图形对象绘制的内容getGraphics

于 2010-03-09T16:00:33.893 回答
2

在这种情况下,那些 pageComponents,小的 JPanel 会发生什么?父面板不会在它们上面绘制形状是吗?

我不确定我是否理解您的评论。您的主面板应包含子面板。应使用布局管理器将子面板添加到主面板。然后当 Swing 决定重新绘制主面板时,它也会重新绘制所有子面板,然后子面板将重新绘制那里的形状。

对于它的价值,自定义绘画方法有一个在面板上绘制形状的工作示例。

于 2010-03-09T16:49:37.070 回答
0

可能是这样,paintChildren或者paintBorder过度绘制了您在方法中绘制的任何内容。也许尝试覆盖paint。在那里,您可以完全控制将在组件上绘制的内容,并且您可以自己决定是否进一步调用paintComponentpaintChildren或者paintBorder根本不调用。

于 2010-03-09T15:00:52.053 回答