[英]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);
我对你问题中的代码做了一些小改动。
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.