JPanel上绘制对象的持久性

时间:2012-03-19 16:35:36

标签: java swing jpanel graphics2d

嗨专家:我有一个类,它扩展了JPanel现在的ShapePanel(Sp),它被添加到一个普通的JPanel(容器)中,它被添加到JFrame(Window)。在paintComponent方法中,我绘制一个形状....但是渲染后形状永远不会存在。在调试器中,我可以看到每次调整大小或类似的东西时都会重新绘制它。

现在我重载了JPanel(Sp的)paintComponent并添加了这个

    super.paintComponent(g);        

    ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());
    //for(Shape s : ArrayOfShapes)
    {
        if(s instanceof Rectangle)
                SdG.Paint((Rectangle)s);
            else if(s instanceof Triangle)
                SdG.Paint((Triangle)s);
            else
                SdG.Paint((Circle)s);
    } //s is a custom-shape object

图形对象来自(显然)JPanel ....

但绘制的图像永远不会留在面板上 - 你会看到它瞬间消失......

我做了一些搜索,但没有用。

实际绘图

public ShapeDrawerGui(Graphics2D _g)
{
    g = _g;
    g.setColor(Color.Black);
}

@Override
public void Paint(Circle c) 
{
    g.drawArc(0, 0, 50, 50, 0, 360);
}

@Override
public void Paint(Triangle t) 
{        
    Polygon p = new Polygon();
    p.addPoint(0, 25);
    p.addPoint(0 , 50);
    p.addPoint(50, 50);       
    g.drawPolygon(p);
}

@Override
public void Paint(Rectangle r) 
{
    g.drawRect(0, 0, 50, 50);
}

亲切的问候

马库斯

2 个答案:

答案 0 :(得分:2)

  

.. this.getGraphics和g ..之间的区别是什么?

GUI应该在被告知这样做时重新绘制,并使用提供给Graphicspaint(Graphics)方法的paintComponent(Graphics)对象。 GUI可以随时调用该方法,例如,在另一个窗口后面重新绘制。

当您拨打getGraphics()时,会向您提供一个非持久性图形对象,该对象将在下一次绘制时消失。

答案 1 :(得分:1)

问题在于:

super.paintComponent(g);        

ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());

gSdG是两个不同的对象,而且与直觉相反,属于您的专用面板的g并非总是吸引它的那个。g

根据您的程序正在执行的操作,它们可以同时用于绘制到画布,但是,SgD将始终绘制到最后并在Graphics2D完成绘制后保留。 即使您检索的SgD getGraphics() DOES属于您想要绘制到的组件,(getGraphics())并不意味着它是图形用于绘制画布。

我知道这是违反直觉的。每个jJXXX都有一个相关的Graphics对象,用于绘制它,但这并不意味着它将被Swing用于绘制它,无论如何。

通过paintComponent中的参数向您显示的图形与从paintComponent()获得的图形不同,即使paintComponent(Graphics g)是同一对象上的方法,因为您正在调用getGraphics上。

如果你想看到这个,只需在boolean sameObject = (g== getGraphics()) 中的第一行设置一个布尔值:

sameObject

并打印出false。你会看到单词g

因此两者都被用来绘制到屏幕上。你看到了它,因为当时画布的g正在进行绘图。然后微秒后,您作为参数接收的{{1}}正在进行绘图,并且最后绘制。

最后赢得胜利的人。这是一种反向显示。