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类,那么我们可以用它来绘制其他形状, 但它不在这里工作:(
答案 0 :(得分:2)
您不能保留Graphics的实例并在需要时随时调用它。绘画应该只在paintComponent()
方法中完成,使用作为参数传递的Graphics对象。
在actionPerformed()
方法中,更改面板的州,然后致电repaint()
。然后,在paintComponent()
方法中,阅读面板的状态,并进行相应的绘制。
例如,在您的情况下,状态可以是要绘制的形状列表。
答案 1 :(得分:1)
当您在paint
类型方法之外绘制图形时,您往往会遇到问题。 全部绘图到JPanel
的图形应该在paintComponent
方法内部发生。过度地说,即使这样做有效,当用户执行调整屏幕重新调整大小的事情时,更改也会被覆盖。
如果您无法将程序重新构建为仅在paintComponent
进行绘制,则可以选择将所有绘图都设置为BufferedImage
,然后将图像重新绘制到{{1}在重画上。当然,这也存在问题(例如,如果图像不够大则调整大小的成本会更高),所以这不应该是goto方法;相反,更改您的代码,以便重绘方法尽可能知道要绘制的内容。
答案 2 :(得分:0)
所有绘画都应该在你的paintComponent
方法(已经突出显示)的上下文中完成,但这会引发一个问题:
您应该在List
中放置某种可绘制的对象,其中包含有关内容,位置和大小的信息。
最简单的解决方案是使用类似Shape
扩展的类,这些可以通过Graphics
上下文简单地绘制或填充
请参阅...
了解更多详情