为什么要重绘我的画时repaint()不起作用?

时间:2019-05-29 00:00:01

标签: java jpanel

这是我的第一个Java动画,我希望我的标志开始使用repaint(),但是该方法不执行任何操作,我也不知道为什么。这是关于moveFlag方法的,它应该将标志置于运动中,使人联想起在风中飘扬的标志。该应用程序仅显示该标志,但不会移动它。

public class Testing extends JPanel implements ActionListener {
    private int x,y, xinc, yinc;

    public void paintComponent(Graphics g){
        xinc = 10;
        yinc = 10;
        x = 101;
        y = 151;

        Graphics2D gimg = (Graphics2D) g;

        Rectangle2D rect = new Rectangle2D.Double(50,50,10,300);

        CubicCurve2D cub1 = new 
        CubicCurve2D.Double(60,50,x,10,y,100,200,50);
        gimg.draw(cub1);

        CubicCurve2D cub2 = new 
        CubicCurve2D.Double(60,100,x,60,y,150,200,100);
        gimg.draw(cub2);

        CubicCurve2D cub3 = new 
        CubicCurve2D.Double(60,150,x,110,y,200,200,150);
        gimg.draw(cub3);

        Line2D l1 = new Line2D.Double(200,50,200,150);
        gimg.draw(l1);

        GeneralPath gp1 = new GeneralPath();    
        GeneralPath gp2 = new GeneralPath();

        gp1.moveTo(60,50);
        gp1.curveTo(x,10,y,100,200,50);
        gp1.lineTo(200,100);
        gp1.curveTo(y,150,x,60,60,100);
        gp1.lineTo(60,50);

        gimg.setColor(Color.WHITE);

        gimg.fill(gp1);

        gimg.setColor(Color.GRAY);

        gimg.fill(rect);    

        gp2.moveTo(60,100);   
        gp2.curveTo(x,60,y,150,200,100);
        gp2.lineTo(200,150);
        gp2.curveTo(y,200,x,110,60,150);
        gp2.lineTo(60,100);

        gimg.setColor(Color.RED);

        gimg.fill(gp2);
    }    
    public void moveFlag(){  //waving animation    
        Timer timer = new Timer(20, this);
        timer.start();

        x = x + xinc;
        y = y + yinc;

        if(x<=60||(x+xinc)>=130)
            xinc*=-1;

        if(y<=50||(y+yinc)>=230)
            yinc*=-1;

        //revalidate();
        repaint();
    }       
    @Override
    public void actionPerformed(ActionEvent e) {

    }  
    public static void main(String [] args){
        JFrame frame = new JFrame();

        Testing test = new Testing();
        frame.setContentPane(test);
        frame.setSize(500,500);
        frame.setVisible(true);

        test.moveFlag();    
    }
}

1 个答案:

答案 0 :(得分:0)

您的想法正确,但其中一些代码放置在错误的位置。我将在评论中进行解释。

void myApp1::MainPage::ButtonPick_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    Application::Current->hide();
}

我唯一需要添加的代码就是super.paintComponent(g)调用。这是必要的,因为您要覆盖paintComponent(),因此需要确保在绘制图形之前已调用父方法。