为了账号安全,请及时绑定邮箱和手机立即绑定

Java AWT如何延迟绘制对象

Java AWT如何延迟绘制对象

暮色呼如 2022-10-26 16:55:55
我想每 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 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

首先,不要改变JFrame绘制的方式(换句话说,不要覆盖paintComponent()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));

    }

}


查看完整回答
反对 回复 2022-10-26
?
MYYA

TA贡献1868条经验 获得超4个赞

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



查看完整回答
反对 回复 2022-10-26
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信