Java 在同一个 JFrame 中绘制多个正方形

粗暴地

我正在尝试使用多线程制作动画。我想n来自推荐行参数的地方绘制n 个正方形每个方块都有它们的 xy 坐标、颜色和速度。它们以不同的速度、颜色和坐标移动到框架的右侧。由于我使用的是多线程,因此我假设我必须控制每个方块。所以我必须将每个方形对象存储在 ArrayList 中。但是,我在绘制这些方块时遇到了麻烦。我可以画一个正方形,但是当我尝试画多个正方形时,它不显示。这是我到目前为止所做的:

DrawSquare.java

import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawSquare extends JPanel {
    public Square square;
    public DrawSquare() {
        square = new Square();
    }

    @Override
    public void paintComponents(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponents(g);

    }

    @Override
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);

        g.setColor(square.getC());
        g.fillRect(square.getX(), square.getY(), square.getR(), square.getR());
    }
}

Square.java

import java.awt.Color;
import java.util.Random;

public class Square {
    private int x,y,r,s;
    private Color c;
    private Random random;

    public Square() {
        random = new Random();
        x = random.nextInt(100) + 30;
        y = random.nextInt(100) + 30;
        r = random.nextInt(50) + 20;
        s = random.nextInt(20) + 5;
        c = new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getR() {
        return r;
    }

    public int getS() {
        return s;
    }

    public Color getC() {
        return c;
    }
}

动画.java

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Animation extends JFrame implements Runnable {
    private JPanel panel;
    private DrawSquare square;

    public Animation() {

    }

    public static void main(String[] args) {
        Animation w = new Animation();
        DrawSquare square = new DrawSquare();
        JFrame f = new JFrame("Week 9");
        int n = Integer.parseInt(args[0]);
        f.setVisible(true);
        f.setSize(700,700);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        for(int i=0; i<n; i++) {
            f.getContentPane().add(square);
        }
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
}
疯狂程序员

所以,从...

public class DrawSquare extends JPanel {
    public Square square;
    public DrawSquare() {
        square = new Square();
    }

    @Override
    public void paintComponents(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponents(g);

    }

    @Override
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);

        g.setColor(square.getC());
        g.fillRect(square.getX(), square.getY(), square.getR(), square.getR());
    }
}

作为一般建议,最好在paintComponent方法中放置自定义绘画(注意,s最后没有

paint被调用时,Graphics上下文已经被翻译到组件的坐标位置。这意味着0x0是组件的上/左角,这也意味着......

g.fillRect(square.getX(), square.getY(), square.getR(), square.getR());

x + xx处绘制矩形y + y,这至少会将矩形绘制在错误的位置,最坏的情况是将其绘制到组件的可见范围之外。

您也没有为组件提供任何大小提示,因此它的默认大小将为0x0,从而防止它被绘制。

由于我使用的是多线程,因此我假设我必须控制每个方块。

好吧,因为我真的看不出是什么驱动了动画,我想当你说“多线程”时,你是在暗示每个方块都有它自己的“线程”。在这种情况下,这是一个坏主意。让我们暂时搁置线程同步问题,更多的线程不等于您可以做更多的工作,在某些时候,它会开始降低系统性能。

在大多数情况下,您真正​​需要的只是一个管理良好的线程。您还必须了解 Swing 不是线程安全的。这意味着您不应从事件调度线程的上下文之外更新 UI(或 UI 依赖的状态)。

所以,为什么你的线程可以更新矩形的位置,你需要注意确保它们没有被绘制为什么它们被更新。一旦你更新了状态,你就需要触发一个绘制过程(这本身是微不足道的)

所以我必须将每个方形对象存储在 ArrayList 中。

是的,好的开始

但是,我在绘制这些方块时遇到了麻烦。我可以画一个正方形,但是当我尝试画多个正方形时,它不显示。

好的,所以不要使用多个组件,而是使用一个。ArrayListpaintComponent此组件方法中运行并绘制所有矩形。这提供了一种更简单的方法来管理边界检测之类的事情,因为您只需担心一个容器。

我强烈建议你看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中同一个类的继承与组合

来自分类Dev

Java中多个线程访问同一个对象

来自分类Dev

如何使用 GSON 从同一个 JSON 文件中获取多个 Java 对象?

来自分类Dev

多个Rhino(java)线程处理同一个文件

来自分类Dev

Java多个程序在同一个文本文件上写入

来自分类Dev

Java:多个线程同时读取同一个InputStream

来自分类Dev

为什么同一个OpenGL函数在Clojure中的执行与在Java中如此不同?

来自分类Dev

无法在Java中的同一个包内继承

来自分类Dev

java无法从同一个类中获取静态变量的值

来自分类Dev

用Java创建一个循环正方形

来自分类Dev

用Java创建一个循环正方形

来自分类Dev

Java:如何从不在同一文件中但在同一包中的另一个Jframe打开一个Jframe;

来自分类Dev

是否可以在java中为同一个客户端创建多个套接字?

来自分类Dev

Java在一个Jframe中获取输入字符串,并在另一个Jframe中显示

来自分类Dev

用不同的泛型类型实现同一个泛型Java接口的多个实例?

来自分类Dev

Java:在同一个程序包中具有循环依赖关系是不好的做法吗?

来自分类Dev

java在同一个类中两次使用类名时传递变量

来自分类Dev

在同一个图上绘制多个 axhlines

来自分类Dev

JAVA无法从另一个类中绘制到JFrame上

来自分类Dev

从另一个Java类而不是同一个Java类中获取字符串信息

来自分类Dev

在gnuplot中从x到y坐标绘制一个正方形

来自分类Dev

在JS中以最小的时间复杂度绘制一个带边框的正方形

来自分类Dev

多个在同一个按钮中展开-Swift

来自分类Dev

在同一个函数中返回多个变量

来自分类Dev

在同一个uri中更新多个结果

来自分类Dev

Java的多键指向同一个值

来自分类Dev

QPixmap复制一个正方形的内容绘制到另一个图像中

来自分类Dev

Java JFrame绘制多行

来自分类Dev

Java:无法在另一个 Java 文件中更改 JFrame 组件的内容

Related 相关文章

  1. 1

    Java中同一个类的继承与组合

  2. 2

    Java中多个线程访问同一个对象

  3. 3

    如何使用 GSON 从同一个 JSON 文件中获取多个 Java 对象?

  4. 4

    多个Rhino(java)线程处理同一个文件

  5. 5

    Java多个程序在同一个文本文件上写入

  6. 6

    Java:多个线程同时读取同一个InputStream

  7. 7

    为什么同一个OpenGL函数在Clojure中的执行与在Java中如此不同?

  8. 8

    无法在Java中的同一个包内继承

  9. 9

    java无法从同一个类中获取静态变量的值

  10. 10

    用Java创建一个循环正方形

  11. 11

    用Java创建一个循环正方形

  12. 12

    Java:如何从不在同一文件中但在同一包中的另一个Jframe打开一个Jframe;

  13. 13

    是否可以在java中为同一个客户端创建多个套接字?

  14. 14

    Java在一个Jframe中获取输入字符串,并在另一个Jframe中显示

  15. 15

    用不同的泛型类型实现同一个泛型Java接口的多个实例?

  16. 16

    Java:在同一个程序包中具有循环依赖关系是不好的做法吗?

  17. 17

    java在同一个类中两次使用类名时传递变量

  18. 18

    在同一个图上绘制多个 axhlines

  19. 19

    JAVA无法从另一个类中绘制到JFrame上

  20. 20

    从另一个Java类而不是同一个Java类中获取字符串信息

  21. 21

    在gnuplot中从x到y坐标绘制一个正方形

  22. 22

    在JS中以最小的时间复杂度绘制一个带边框的正方形

  23. 23

    多个在同一个按钮中展开-Swift

  24. 24

    在同一个函数中返回多个变量

  25. 25

    在同一个uri中更新多个结果

  26. 26

    Java的多键指向同一个值

  27. 27

    QPixmap复制一个正方形的内容绘制到另一个图像中

  28. 28

    Java JFrame绘制多行

  29. 29

    Java:无法在另一个 Java 文件中更改 JFrame 组件的内容

热门标签

归档