嗨专家:我有一个类,它扩展了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);
}
亲切的问候
马库斯
答案 0 :(得分:2)
.. this.getGraphics和g ..之间的区别是什么?
GUI应该在被告知这样做时重新绘制,并使用提供给Graphics
或paint(Graphics)
方法的paintComponent(Graphics)
对象。 GUI可以随时调用该方法,例如,在另一个窗口后面重新绘制。
当您拨打getGraphics()
时,会向您提供一个非持久性图形对象,该对象将在下一次绘制时消失。
答案 1 :(得分:1)
问题在于:
super.paintComponent(g);
ShapeDrawerGui SdG = new ShapeDrawerGui((Graphics2D)this.getGraphics());
g
和SdG
是两个不同的对象,而且与直觉相反,属于您的专用面板的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}}正在进行绘图,并且最后绘制。
最后赢得胜利的人。这是一种反向显示。