在另一个JPanel中重绘JPanel的问题

时间:2010-03-09 14:52:06

标签: java jpanel repaint redraw

我正在此JPanel内绘制形状,这也是另一个主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());

    }
}

如果父级是启用了JEditorPane的{​​{1}},它就可以工作,我们可以看到形状但是当它是setEditable()时,在一毫秒后我看到的只是空面板。< / p>

4 个答案:

答案 0 :(得分:3)

你应该绘制到JPanel的Graphics对象,因为它是永久的...在你的例子中,那是Graphics g ...

答案 1 :(得分:2)

ultrajohn已经死了。您需要使用已通过的Graphics。请继续阅读原因......

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

在这种情况下,您正在使用多个Graphics2D对象:传递到g的{​​{1}}和paintComponent调用返回的值。

重绘经理已经递给你getGraphics画画。注意:这不会在屏幕上绘制,而是在临时缓冲区上绘制(假设默认为双缓冲)。

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

getGraphics返回时,paintChildren开始处理更新双缓冲区。它在显示的缓冲区上绘制空白临时缓冲区,有效地擦除从RepaintManager

获取的图形对象绘制的内容

答案 2 :(得分:2)

  

在这种情况下会发生什么   pageComponents,小型JPanels?该   父母小组不会画出来的   它们上面的形状是什么?

我不确定我是否同意你的意见。您的主面板应包含子面板。应使用布局管理器将子面板添加到主面板。然后,当Swing决定重新绘制主面板时,它还将重新绘制所有子面板,然后子面板将重新绘制形状。

它的价值Custom Painting Approaches有一个在面板上绘制形状的工作示例。

答案 3 :(得分:0)

可能是paintChildrenpaintBorder透支了您在方法中绘制的内容。或许尝试覆盖paint。在那里,您可以完全控制组件上的内容,您可以自行决定是否进一步调用paintComponentpaintChildrenpaintBorder