繁体   English   中英

Java Swing GUI 失真 animation

[英]Java Swing GUI distort animation

我想构建一个简单的 animation 三个球朝一个方向移动。 因此,我创建了一个计时器,它在每次滴答时编辑球的坐标,但是当我尝试运行它时,球就会变形。 它们以正确的速度和方向移动,但我想在它们改变坐标时移除旧球。 我试图在paint方法中添加super.paint() 它正在删除旧球,但大多数时候框架只是白色的。

public class Animation extends JFrame{
    private JPanel panel2;
    int maus1x = 110;
    int maus1y = 350;
    int maus2x = 55;
    int maus2y = 350;
    int maus3x = 0;
    int maus3y = 350;
    ActionListener timeListener = new TimeListener();
    Timer timer = new Timer(100,timeListener);

    public Animation() {
        this.setContentPane(this.panel2);
        this.setTitle("MausKampf");
        this.setSize(500, 500);
        this.setResizable(false);
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        timer.start();
    }

    public void paint(Graphics g) {
        Graphics2D g2D = (Graphics2D) g;
        g2D.setColor(Color.black);
        g2D.drawLine(0,400,500,400);
        g2D.drawLine(0,350,225,350);
        g2D.drawLine(275,350,500,350);
        g2D.drawLine(225,350,225,0);
        g2D.drawLine(275,350,275,0);
        g2D.setPaint(Color.CYAN);
        g2D.fillOval(maus1x,maus1y,50,50);
        g2D.setPaint(Color.GREEN);
        g2D.fillOval(maus2x,maus2y,50,50);
        g2D.setPaint(Color.RED);
        g2D.fillOval(maus3x,maus3y,50,50);
    }

    public void move() {
        maus1x = maus1x + 4;
        maus2x = maus2x + 4;
        maus3x = maus3x + 4;
        if (maus1x > 325) {
            timer.stop();
        }
        repaint();
    }

    public class TimeListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            move();
        }
    }
}

Swing应用程序不必扩展JFrame 但是,如果你想执行自定义绘画,那么你应该写一个 class 扩展JPanel并覆盖它的paintComponent方法,覆盖方法的第一行应该是: super.paintComponent(g);

我对你问题中的代码做了一些小改动。

  • 首先, class Animation扩展JPanel而不是JFrame
  • 其次,我将方法paint重命名为paintComponent并添加了上述行。
  • 最后,我添加了方法main以使其可运行
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.WindowConstants;

public class Animation extends JPanel {
    int maus1x = 110;
    int maus1y = 350;
    int maus2x = 55;
    int maus2y = 350;
    int maus3x = 0;
    int maus3y = 350;
    ActionListener timeListener = new TimeListener();
    Timer timer = new Timer(100,timeListener);

    public Animation() {
        JFrame frame = new JFrame("MausKampf");
        frame.setContentPane(this);
        frame.setSize(500, 500);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
        timer.start();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2D = (Graphics2D) g;
        g2D.setColor(Color.black);
        g2D.drawLine(0,400,500,400);
        g2D.drawLine(0,350,225,350);
        g2D.drawLine(275,350,500,350);
        g2D.drawLine(225,350,225,0);
        g2D.drawLine(275,350,275,0);
        g2D.setPaint(Color.CYAN);
        g2D.fillOval(maus1x,maus1y,50,50);
        g2D.setPaint(Color.GREEN);
        g2D.fillOval(maus2x,maus2y,50,50);
        g2D.setPaint(Color.RED);
        g2D.fillOval(maus3x,maus3y,50,50);
    }

    public void move() {
        maus1x = maus1x + 4;
        maus2x = maus2x + 4;
        maus3x = maus3x + 4;
        if (maus1x > 325) {
            timer.stop();
        }
        repaint();
    }

    public class TimeListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            move();
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new Animation());
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM