我假设您正在某个
paint/paintComponent方法中调用此方法。
只是一个提示: 从来没有睡过油漆过程
而是将a
javax.swing.Timer用于重复任务。什么
我 会做的是
有两个
Lists
。你List<Point> bresenham
和另一个List<Point> paintList
。该bresenham
会握住你的数据,并且paintList
将初始为空。用
paintList
画你的观点
@override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; for (Point p : paintList) { int x = bresenham.get(i).x - pointWidth1/2; int y = bresenham.get(i).y - pointWidth1/2; int ovalW = pointWidth1; int ovalH = pointWidth1; g.fillOval(x, y, ovalW, ovalH); } }- 尽管最初没有任何内容
paintList
,但您会Point
在每次触发计时器事件时将一个新值添加到列表中。
Timer timer = new Timer(100, new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { if (bresenham.isEmpty()) { ((Timer)e.getSource()).stop(); } else { paintList.add(bresemham.get(0)); bresenham.remove(0); } repaint(); } }); timer.start();构造函数的基本计时器为firs the
delay,它是 “ iterations”
和侦听器中第二个参数之间的延迟时间,该参数实际上侦听每
delay毫秒触发的计时器事件。那么上面的代码通常做的就是添加
Point到
paintList取自
bresenham列表,然后删除的项目
repaint,其调用
paintComponent。当列表为空时,计时器将停止。
更新
这是一个完整的运行示例
import java.awt.Dimension; import java.awt.Graphics; import java.awt.Point; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.Timer; public class BresenhamPoints extends JPanel { private static final int D_W = 500; private static final int D_H = 500; private List<Point> bresenhamList; private List<Point> paintList; public BresenhamPoints() { bresenhamList = createRandomPoints(); paintList = new ArrayList<>(); Timer timer = new Timer(100, new ActionListener() { public void actionPerformed(ActionEvent e) { if (bresenhamList.isEmpty()) { ((Timer) e.getSource()).stop(); } else { paintList.add(bresenhamList.get(0)); bresenhamList.remove(0); } repaint(); } }); timer.start(); } private List<Point> createRandomPoints() { Random rand = new Random(); List<Point> list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add(new Point(rand.nextInt(D_H), rand.nextInt(D_H))); } return list; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (Point p : paintList) { g.fillOval(p.x - 5, p.y - 5, 10, 10); } } @Override public Dimension getPreferredSize() { return new Dimension(D_W, D_H); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Jframe frame = new Jframe(); frame.add(new BresenhamPoints()); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } }


