【问题标题】:G2D updating with lists of coordinates使用坐标列表进行 G2D 更新
【发布时间】:2015-09-17 15:24:16
【问题描述】:

我想编写一个程序来模拟蚂蚁。假设我有 100 只蚂蚁,每只蚂蚁都有坐标 (2 integers)。我使用 Java 图形 (Graphics2D)。

现在我想要一个可以读取这样列表的类:

List<List<Integer>> list = new ArrayList();

这个列表有例如:

[100,200],[200,100]

作为其中的坐标。现在我希望班级随时更新并删除所有“点”(蚂蚁),然后用列表中的坐标绘制新的。

现在这行不通。

public class FrameHandler {

Panel panel  = new Panel();

public FrameHandler() {
    //initialize frame
    frame.repaint();

    List<List<Integer>> test = new ArrayList();
    List<Integer> t1 = new ArrayList();
    t1.add(100);
    t1.add(200);
    test.add(gunther);

    frame.add(panel);

    panel.setList(test);

    //the thread sleeps for 5 seconds

    List<Integer> t2 = new ArrayList();
    t2.add(100);
    t2.add(100);
    test.add(gunther2);

    panel.removeAll();

    panel.setList(olaf);
}


public void setList(List<Integer> list) {
    panel.setList(list);
}

public void setSize(int width, int height) {
    frame.setSize(width, height);
}

private class Panel extends JPanel {

    List<List<Integer>> antList = new ArrayList();

    private void doDrawing(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;

        for(int i = 0; i < antList.size(); i++) {
            g2d.fillRect(antList.get(i).get(0), antList.get(i).get(1), 2, 2);
        }
    }

    @Override
    public void paintComponent(Graphics g) {

        super.paintComponent(g);
        doDrawing(g);
    }

    public void setList(List<List<Integer>> list) {
        antList = list;
    }
}

}

如果您对如何解决问题有其他想法,也许使用 API 或其他处理图形的方法,我会很高兴听到它。

【问题讨论】:

  • “现在我希望班级随时更新并删除所有“点”(蚂蚁),然后用列表中的坐标绘制新的。” - 这就是 Swing 中绘画的工作原理。您可能需要使用 Swing Timer 来更新 List 并重新安排绘制事件,请参阅 How to use Swing Timers 了解更多详情

标签: java graphics graphics2d


【解决方案1】:

现在我希望班级随时更新并删除所有“点”(蚂蚁),然后使用列表中的坐标绘制新的。

这基本上是 Swing 中绘制的工作方式,在每个绘制周期中,您需要从头开始重新绘制组件的整个状态。详情请见Painting in AWT and Swing

所以问题就变成了,你如何更新List。虽然有多种方法可以做到这一点,但使用 Swing Timer 可能是最简单的(通常也是最安全的)。详情请见How to use Swing Timers

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FrameHandler {

    public static void main(String[] args) {
        new FrameHandler();
    }

    public FrameHandler() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        protected static final Random RANDOM_DELTA = new Random();

        private List<List<Integer>> ants;

        public TestPane() {
            Random rnd = new Random();
            ants = new ArrayList<>(25);
            for (int index = 0; index < 10; index++) {
                List<Integer> ant = new ArrayList<>(2);
                // You should also have a look at the java.awt.Point class :P
                ant.add(rnd.nextInt(200 - 2)); //x
                ant.add(rnd.nextInt(200 - 2)); //y
                ants.add(ant);
            }

            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    for (List<Integer> ant : ants) {
                        int xDelta = randomDelta();
                        int yDelta = randomDelta();

                        int x = ant.get(0) + xDelta;
                        int y = ant.get(1) + yDelta;

                        if (x < 0) {
                            x = 0;
                        } else if (x + 2 > getWidth()) {
                            x = getWidth() - 2;
                        }
                        if (y < 0) {
                            y = 0;
                        } else if (y + 2 > getHeight()) {
                            y = getHeight() - 2;
                        }

                        ant.set(0, x);
                        ant.set(1, y);
                    }
                    repaint();

                }
            });
            timer.start();
        }

        protected int randomDelta() {
            int delta = 0;
            do {
                double rnd = Math.random();
                delta = rnd < 0.5d ? -1 : 1;
            } while (delta == 0);
            return delta;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            for (List<Integer> ant : ants) {
                g2d.fillRect(ant.get(0), ant.get(1), 2, 2);
            }
            g2d.dispose();
        }

    }

}

这个例子基本上为每只蚂蚁的 x 和 y 坐标生成一个随机增量(方向变化)。我怀疑你可能需要一些更复杂的东西

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多