Java JPanel上绘制对象的持久性
各位专家:我有一个类扩展了JPanel now ShapePanel(Sp),它被添加到一个普通的JPanel(容器)中,inturn被添加到JFrame(窗口)中。在paintComponent方法中,我绘制了一个形状。。。。但渲染后,形状永远不会保持不变。在调试器中,我可以看到每当我调整大小或类似的事情时,它都会被重新绘制 现在我重载了JPanel(Sp)的paintComponent并添加了这个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
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())
toShapeDrawerGui SdG=新的ShapeDrawerGui((图形2d)g)
“图形对象(显然)来自JPanel”通常会让事情变得显而易见。@AndrewThompson:我不敢相信,但它确实奏效了。。。。那么,this.getGraphics和g有什么区别呢?它们是一个相同的东西,不是吗?您有Paint()
方法,大写为P-ouch。。嗯,这不是问题。您是否尝试过更改ShapeDrawerGui SdG=new ShapeDrawerGui((Graphics2D)this.getGraphics())
toShapeDrawerGui SdG=新的ShapeDrawerGui((图形2d)g)
“图形对象(显然)来自JPanel”通常会让事情变得显而易见。@AndrewThompson:我不敢相信,但它确实奏效了。。。。