在透明的JPanel上绘画时留下痕迹

我是Java中相对较新的图形程序员,这是一个我正在尝试的简单程序。 这是完整的代码:分为3个类。

第1类:

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyPanelB extends JPanel { int x=0; int y=0; public void paintComponent(Graphics g) { x=x+1; y=y+1; setOpaque(false); //setBackground(Color.cyan); g.setColor(Color.red); g.fillRect(x,y,x+1,y+1); } } 

第2类:

 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyFrameB implements ActionListener { MyPanelB p1; public void go() { JFrame f1= new JFrame(); f1.setLocation(150,50); f1.setSize(800,700); f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p0= new JPanel(); p0.setBackground(Color.yellow); p0.setLayout(new BorderLayout()); f1.add(p0); p1= new MyPanelB(); p0.add(p1); f1.setVisible(true); Timer t = new Timer(200,this); t.start(); } public void actionPerformed(ActionEvent ev) { p1.repaint(); } } 

第3类(主类):

 public class MyBMain { public static void main(String[] args) { MyFrameB m1= new MyFrameB(); m1.go(); } } 

如果我注释掉了stament setOpaque(false); 在第1类,我得到一条痕迹(红色扩展矩形),但不是黄色背景。 否则我没有得到痕迹,但我得到一个黄色背景。 我想要黄色背景和痕迹。 请随意修改我的代码,以便获得跟踪和黄色背景。 我提供了完整的代码,因此可以轻松检查输出。

基本上,每次调用paintComponent()方法时都需要重新绘制整个组件。 这意味着您需要从0开始并迭代到x的当前值。

所以你的paintComponent()方法应该类似于:

 public void paintComponent(Graphics g) { super.paintComponent(g); x=x+1; y=y+1; for (int i = 0; i < x; i++) { g.setColor(getForeground()); //g.fillRect(x,y,x+1,y+1); g.fillRect(i,i,i+1,i+1); } } 

这意味着您不需要panel0。 我还更改了创建panel1的代码:

 p1= new MyPanelB(); p1.setForeground(Color.RED); p1.setBackground(Color.YELLOW); f1.add(p1); 

即使我发布给你的这段代码也不正确。 不应在paintComponent()方法中更新x / y值。 在代码执行时尝试调整框架大小以查明原因?

您的ActionListener应该调用panel1类中的方法来更新类的属性,以告诉paintComponent()在调用时迭代和绘制方形的次数。 paintComponent()方法应该在我创建的循环中引用此属性。