簡體   English   中英

如何從Java中的ArrayList繪制對象

[英]How to draw objects from an ArrayList in Java

好的,所以我試圖制作一個程序,該程序繪制一堆隨機在屏幕上移動的矩形。 我有一個Dot類,其中每個點都包含其x和y值,在我的繪畫類中,我隨機更改x和y值,然后重新繪制()。 我現在所擁有的除了空白JFrame之外不會加載任何其他東西。 我懷疑我把每個點畫錯了。 以下是我的代碼:

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;

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

public class Movement extends JFrame {
    public ArrayList<Dot> dots = new ArrayList<Dot>();
    Random rn = new Random();
    DrawPanel drawPanel = new DrawPanel();
    public Movement() {
        for(int i = 0; i < 100; i ++) {
            Dot dot = new Dot(5, 5);
            dots.add(dot);
        }
        ActionListener listener = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                    for(int i = 0; i < dots.size();i++) {
                        dots.get(i).setX(dots.get(i).getX() + rn.nextInt(20)-10);
                        dots.get(i).setY(dots.get(i).getY() + rn.nextInt(20)-10);
                    }
                    drawPanel.repaint();

            }
        };
        Timer timer = new Timer(100, listener);
        timer.start();
        add(drawPanel);

        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
        setBounds(100, 100, 500, 500);
    }

    private class DrawPanel extends JPanel {

        protected void paintComponent(Graphics g) {
             for(int i = 0; i < dots.size(); i ++) {
                g.fillRect(dots.get(i).getX(), dots.get(i).getY(), 5, 5);;
                super.paintComponent(g);
             }


        }

    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Movement();
            }
        });
    }
}

點類:

public class Dot {
    private int x, y;
    public Dot(int x, int y) {
        this.x = x;
        this.y = y;

    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

}

任何和所有幫助表示贊賞。

如果您調用super.paintComponent(g); 繪制自己的組件后,您便會擦除自己的繪畫。 所以,

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
         for(int i = 0; i < dots.size(); i ++) {
             g2d.fillRect(dots.get(i).x, dots.get(i).y, 5, 5);
         }
    }

也,

// don't repeat type in constructor
// use built in point instead of custom class
public ArrayList<Point> dots = new ArrayList<>();

    ActionListener listener = new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
                for(int i = 0; i < dots.size();i++) {
                    dots.get(i).x = dots.get(i).x + rn.nextInt(20)-10;
                    dots.get(i).y = dots.get(i).y + rn.nextInt(20)-10;
                }
                drawPanel.repaint();
        }
    };

可能沒有什么區別,但是

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Movement mf = new Movement();
        }
    });

繪制點后,您似乎正在調用super.paintComponent 不僅如此,您似乎在循環內調用它,在繪制完之后每次繪制點時都調用它。

因此,您將繼續繪制一個點,讓super.paintComponent繪制一個透明的面板,然后繪制另一個點,然后再次撤消它,再繪制另一個,撤消...等等。

一次調用super.paintComponent ,並在進行自定義繪畫之前執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM