-1
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类的引用,那么我们可以在绘制其他形状时使用它,但它在这里不起作用:(

4

3 回答 3

2

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

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

于 2013-08-01T19:57:51.487 回答
1

当您在类型方法之外绘制图形时paint,您往往会遇到问题。所有对 a 的 Graphics 的绘制都JPanel应该发生在paintComponent方法内部。总的来说,即使这有效,当用户执行诸如调整屏幕大小之类的操作时,当调用 repaint 时,更改也会被覆盖。

如果您不能将程序重组为仅进行paintComponent绘图,则一种替代方法是将您的所有绘图都进行到 aBufferedImage中,然后简单地将图像重绘到Graphics重新绘制时。当然,这也有问题(比如图片不够大,resize的成本更高),所以这不应该是goto方法;相反,更改您的代码,以便 repaint 方法知道如果可能的话要绘制什么。

于 2013-08-01T19:57:44.927 回答
0

所有的绘画都应该在你的paintComponent方法的范围内完成(已经被突出显示),但这提出了如何做的问题?

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

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

看...

更多细节

于 2013-08-01T20:35:07.330 回答