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

Java 在透明的JPanel上画画时留下痕迹,java,swing,graphics,awt,paintcomponent,Java,Swing,Graphics,Awt,Paintcomponent,我是一个相对较新的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=

我是一个相对较新的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类(主要类):

如果我把木桩注释掉 set不透明(假) 在第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);
    }
}
即使是我为你发布的代码也不正确。不应在paintComponent()方法中更新x/y值。在代码执行时尝试调整帧的大小,以了解原因


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

基本上,每次调用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);
    }
}
即使是我为你发布的代码也不正确。不应在paintComponent()方法中更新x/y值。在代码执行时尝试调整帧的大小,以了解原因


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

基本上,每次调用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);
    }
}
即使是我为你发布的代码也不正确。不应在paintComponent()方法中更新x/y值。在代码执行时尝试调整帧的大小,以了解原因


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

基本上,每次调用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);
    }
}
即使是我为你发布的代码也不正确。不应在paintComponent()方法中更新x/y值。在代码执行时尝试调整帧的大小,以了解原因


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

感谢camickr的回答,很抱歉无法提前回复。但这并不是我想要的。在您修改过的程序中,我仍然没有上次paintComponent()调用留下的任何痕迹。我只是用一个paintComponet()调用来完成整个绘制过程。@user3015246,没错。Swing不是为了留下痕迹而设计的。要显示扩展的正方形,您需要从头重做整个绘画。还有一个选项可以通过绘制到BuffereImage来进行增量绘制。但是如果使用paintComponent()方法,您仍然需要绘制整个图像。但这将比从一开始就重做整幅画更有效率。请参阅中的
drawinimage
示例,了解此示例。哦,我没有注意到您发布了答案。但这不是我想要的。例如,如果我注释掉setOpaque(false),它会留下痕迹;线路。我唯一不知道的是背景色。谢谢camickr的回答,很抱歉不能提前回复。但这并不是我想要的。在您修改过的程序中,我仍然没有上次paintComponent()调用留下的任何痕迹。我只是用一个paintComponet()调用来完成整个绘制过程。@user3015246,没错。Swing不是为了留下痕迹而设计的。要显示扩展的正方形,您需要从头重做整个绘画。还有一个选项可以通过绘制到BuffereImage来进行增量绘制。但是如果使用paintComponent()方法,您仍然需要绘制整个图像。但这将比从一开始就重做整幅画更有效率。请参阅中的
drawinimage
示例,了解此示例。哦,我没有注意到您发布了答案。但这不是我想要的。例如,如果我注释掉setOpaque(false),它会留下痕迹;线路。我唯一不知道的是背景色。谢谢camickr的回答,很抱歉不能提前回复。但这并不是我想要的。在您修改过的程序中,我仍然没有上次paintComponent()调用留下的任何痕迹。我只是用一个paintComponet()调用来完成整个绘制过程。@user3015246,没错。Swing不是为了留下痕迹而设计的。要显示扩展的正方形,您需要从头重做整个绘画。还有一个选择,你可以通过痛苦来做增量绘画