采取图形参考将有效吗?

时间:2013-08-01 19:53:04

标签: java swing java-2d paintcomponent repaint

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class GraphicsFunda extends JPanel implements ActionListener
{
 Graphics myg;
 JButton jb;
 GraphicsFunda()
{

 jb = new JButton("Draw");
 add(jb);
 setBackground(Color.YELLOW);
 jb.addActionListener(this);
}
public void paintComponent(Graphics g)
{ 
 myg=g;
 g.drawOval(100,300,50,50);
}
public void actionPerformed(ActionEvent ae)
{
 if(ae.getSource()==jb)
 myg.fillRect(10,10,200,200);
}  
public static void main(String... sd)
{
 GraphicsFunda gf = new GraphicsFunda();
 JFrame jf = new JFrame();
 jf.add(gf,BorderLayout.NORTH);
 jf.setBackground(Color.blue);
 jf.setSize(400,400);
 jf.setVisible(true);
}

}     请帮我解决一下这个问题。        如果我们从paintComponent中引用Graphics类,那么我们可以用它来绘制其他形状, 但它不在这里工作:(

3 个答案:

答案 0 :(得分:2)

您不能保留Graphics的实例并在需要时随时调用它。绘画应该只在paintComponent()方法中完成,使用作为参数传递的Graphics对象。

actionPerformed()方法中,更改面板的,然后致电repaint()。然后,在paintComponent()方法中,阅读面板的状态,并进行相应的绘制。 例如,在您的情况下,状态可以是要绘制的形状列表。

答案 1 :(得分:1)

当您在paint类型方法之外绘制图形时,您往往会遇到问题。 全部绘图到JPanel的图形应该在paintComponent方法内部发生。过度地说,即使这样做有效,当用户执行调整屏幕重新调整大小的事情时,更改也会被覆盖。

如果您无法将程序重新构建为仅在paintComponent进行绘制,则可以选择将所有绘图都设置为BufferedImage,然后将图像重新绘制到{{1}在重画上。当然,这也存在问题(例如,如果图像不够大则调整大小的成本会更高),所以这不应该是goto方法;相反,更改您的代码,以便重绘方法尽可能知道要绘制的内容。

答案 2 :(得分:0)

所有绘画都应该在你的paintComponent方法(已经突出显示)的上下文中完成,但这会引发一个问题:

您应该在List中放置某种可绘制的对象,其中包含有关内容,位置和大小的信息。

最简单的解决方案是使用类似Shape扩展的类,这些可以通过Graphics上下文简单地绘制或填充

请参阅...

了解更多详情