Java AWT如何延迟绘制对象

我想每 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,它会画椭圆形等等。


暮色呼如
浏览 104回答 2
2回答

料青山看我应如是

首先,不要改变JFrame绘制的方式(换句话说,不要覆盖paintComponent()a JFrame)。创建一个扩展类JPanel并绘制它JPanel。其次,不要覆盖paint()方法。覆盖paintComponent()。第三,始终运行 Swing 应用程序,SwingUtilities.invokeLater()因为它们应该在自己的名为 EDT(事件调度线程)的线程中运行。最后,javax.swing.Timer就是你要找的。看看这个例子。它每 1500 毫秒在随机 X、Y 上绘制一个椭圆形。预习:https://i.stack.imgur.com/KGLff.gif 源代码: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));    }}

MYYA

首先,不要继承 JFrame;而是将 JPanel 子类化,并将该面板放在 JFrame 中。其次,不要覆盖paint() - 而是覆盖paintComponent()。第三,创建一个 Swing Timer,并在其 actionPerformed() 方法中进行您想要的更改,然后调用 yourPanel.repaint()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java