Java JPanel上绘制对象的持久性

Java JPanel上绘制对象的持久性,java,swing,jpanel,graphics2d,Java,Swing,Jpanel,Graphics2d,各位专家:我有一个类扩展了JPanel now ShapePanel(Sp),它被添加到一个普通的JPanel(容器)中,inturn被添加到JFrame(窗口)中。在paintComponent方法中,我绘制了一个形状。。。。但渲染后,形状永远不会保持不变。在调试器中,我可以看到每当我调整大小或类似的事情时,它都会被重新绘制 现在我重载了JPanel(Sp)的paintComponent并添加了这个 super.paintComponent(g); Shape

各位专家:我有一个类扩展了JPanel now ShapePanel(Sp),它被添加到一个普通的JPanel(容器)中,inturn被添加到JFrame(窗口)中。在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);
}
问候

马库斯

…这个.getGraphics和g…之间有什么区别

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

当您调用
getGraphics()
时,系统会为您提供一个非持久性图形对象,该对象将在下次绘制时消失

…这个.getGraphics和g…之间有什么区别

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

当您调用
getGraphics()
时,系统会为您提供一个非持久性图形对象,该对象将在下次绘制时消失。

问题在于:

super.paintComponent(g);        

ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());
g
SdG
是两个不同的对象,与直觉相反,属于您的专用面板的
g
并不是始终吸引它的对象

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

我知道这是违反直觉的。每个jJXXX都有一个关联的图形对象,用于绘制到它,但这并不意味着Swing将使用它来绘制到它

通过paintComponent中的参数提供给您的图形与从
getGraphics()
获得的图形不同,尽管
paintComponent()
是在同一对象上调用getGraphics的方法

如果您想看到这一点,只需在
paintComponent(Graphics g)
中的第一行为该语句设置一个布尔值:

并打印出
sameObject
。您将看到单词
false

因此,这两种方法都被用于绘制屏幕。您看到它是因为当时画布的
g
正在绘制。然后,微秒之后,作为参数接收的
g
正在绘制,它最后绘制

最后抽签的人获胜。这是一种反向展示。

问题是:

super.paintComponent(g);        

ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());
g
SdG
是两个不同的对象,与直觉相反,属于您的专用面板的
g
并不是始终吸引它的对象

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

我知道这是违反直觉的。每个jJXXX都有一个关联的图形对象,用于绘制到它,但这并不意味着Swing将使用它来绘制到它

通过paintComponent中的参数提供给您的图形与从
getGraphics()
获得的图形不同,尽管
paintComponent()
是在同一对象上调用getGraphics的方法

如果您想看到这一点,只需在
paintComponent(Graphics g)
中的第一行为该语句设置一个布尔值:

并打印出
sameObject
。您将看到单词
false

因此,这两种方法都被用于绘制屏幕。您看到它是因为当时画布的
g
正在绘制。然后,微秒之后,作为参数接收的
g
正在绘制,它最后绘制


最后抽签的人获胜。这是一种反向显示。

您有
Paint()
大写的p-ouch方法。。嗯,这不是问题。您是否尝试过更改
ShapeDrawerGui SdG=new ShapeDrawerGui((Graphics2D)this.getGraphics())
to
ShapeDrawerGui SdG=新的ShapeDrawerGui((图形2d)g)
“图形对象(显然)来自JPanel”通常会让事情变得显而易见。@AndrewThompson:我不敢相信,但它确实奏效了。。。。那么,this.getGraphics和g有什么区别呢?它们是一个相同的东西,不是吗?您有
Paint()
方法,大写为P-ouch。。嗯,这不是问题。您是否尝试过更改
ShapeDrawerGui SdG=new ShapeDrawerGui((Graphics2D)this.getGraphics())
to
ShapeDrawerGui SdG=新的ShapeDrawerGui((图形2d)g)
“图形对象(显然)来自JPanel”通常会让事情变得显而易见。@AndrewThompson:我不敢相信,但它确实奏效了。。。。