Java AWT如何延迟绘制对象

时间:2019-04-27 18:26:27

标签: java swing graphics timer jframe

我想每2秒绘制一个新的随机形状。

我已经有一个窗口,可以立即显示一些形状。我试图弄乱Timer,使新的东西在几秒钟后出现在窗口中,但是它不起作用,或者整个程序死机了。使用Timer是个好主意吗?我应该如何实施它以使其起作用?

import javax.swing.*;
import java.awt.*;
import java.util.Random;

class Window extends JFrame {

    Random rand = new Random();
    int x = rand.nextInt(1024);
    int y = rand.nextInt(768);
    int shape = rand.nextInt(2);

    Window(){
        setSize(1024,768);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(new Color(0, 52, 255));
        switch(shape) {
            case 0:
                g.fillOval(x, y, 50, 50);
                break;
            case 1:
                g.fillRect(x,y,100,100);
                break;
        }
        repaint();
    }
}

public class Main {
    public static void main(String[] args) {
        Window window = new Window();
    }
}

我也想画一些随机的形状。为此可以在涂料中使用开关吗?我将创建一个随机变量,如果为1,则将绘制矩形,如果为2,则将绘制椭圆等。

2 个答案:

答案 0 :(得分:-1)

首先,不要继承JFrame;子类化JPanel,然后将该面板放在JFrame中。 其次,不要覆盖paint()-而是覆盖paintComponent()。 第三,创建一个Swing Timer,并在其actionPerformed()方法中进行所需的更改,然后调用yourPanel.repaint()

答案 1 :(得分:-1)

首先,请勿更改JFrame的绘制方式(换句话说,请勿覆盖paintComponent()中的JFrame)。创建JPanel的扩展类并绘制JPanel。其次,不要重写paint()方法。覆盖paintComponent()。第三,始终使用SwingUtilities.invokeLater()运行Swing应用程序,因为它们应在自己的名为EDT(事件分发线程)的线程中运行。最后,javax.swing.Timer是您要寻找的。

看看这个例子。每1500毫秒以随机X,Y绘制一个椭圆形。

预览:

preview

源代码:

import java.awt.BorderLayout;
import java.awt.Graphics;

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

public class DrawShapes extends JFrame {
    private ShapePanel shape;

    public DrawShapes() {
        super("Random shapes");
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(shape = new ShapePanel(), BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);
        setLocationRelativeTo(null);

        initTimer();
    }

    private void initTimer() {
        Timer t = new Timer(1500, e -> {
            shape.randomizeXY();
            shape.repaint();
        });
        t.start();
    }

    public static class ShapePanel extends JPanel {
        private int x, y;

        public ShapePanel() {
            randomizeXY();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.fillOval(x, y, 10, 10);
        }

        public void randomizeXY() {
            x = (int) (Math.random() * 500);
            y = (int) (Math.random() * 500);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new DrawShapes().setVisible(true));
    }
}