我是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();
}
}
如果我发表评论 的 setOpaque(假); 在第1类中,我得到一条痕迹(红色扩展矩形),但不是黄色背景。 否则我没有得到痕迹,但我得到一个黄色背景。 我想要黄色背景和痕迹。 请随意修改我的代码,以便我获得跟踪和黄色背景。 我提供了完整的代码,因此可以轻松检查输出。
答案 0 :(得分:3)
基本上,每次调用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);
}
}
这意味着您不需要面板0。我还更改了创建panel1的代码:
p1= new MyPanelB();
p1.setForeground(Color.RED);
p1.setBackground(Color.YELLOW);
f1.add(p1);
即使我为您发布的此代码也不正确。不应在paintComponent()方法中更新x / y值。在代码执行时尝试调整框架大小以查明原因?
您的ActionListener应该调用panel1类中的方法来更新类的属性,以告诉paintComponent()在调用方格时迭代和绘制方形的次数。 paintComponent()方法应该在我创建的循环中引用此属性。