获取paintComponent中多个图形的位置

时间:2015-11-13 10:57:59

标签: java swing graphics paintcomponent

我需要获取我在paintComponent方法中创建的所有绘图的位置坐标。我怎么能这样做?

请注意,我使用计时器执行一些动画,因此坐标会在计时器的每个刻度处发生变化。

public class TestPane extends JPanel {

    private int x = 0;
    private int y = 100;
    private int radius = 20;
    private int xDelta = 2;

    public TestPane() {
        Timer timer = new Timer(10, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                x += xDelta;
                if (x + (radius * 2) > getWidth()) {
                    x = getWidth() - (radius * 2);
                    xDelta *= -1;


                } else if (x < 0) {
                    x = 0;
                    xDelta *= -1;
                }
                label.setText(x+" "+y);
                repaint();
            }
        });
        timer.start();
    }

更多代码......

 protected void paintComponent(Graphics g) {
            Random random = new Random();
            super.paintComponent(g);
            g.setColor(Color.ORANGE);
            g.fillOval(random.nextInt(500), random.nextInt(500) - radius, radius * 2, radius * 2);

            g.setColor(Color.BLUE);
            g.fillOval(y, x - radius, radius * 2, radius * 2);
//            label.setText(label.getText()+ x+" "+y); ;
            g.setColor(Color.RED);
            g.fillOval(x, y - radius, radius * 2, radius * 2);
//            label.setText(label.getText()+ x+" "+y);
        }

1 个答案:

答案 0 :(得分:2)

您的程序应保留List<Node>作为类级别属性。 Node的每个实例都应包含渲染程序中每个元素所需的几何体。

class Node {
    private Point p;
    private int r;
    …
}

ActionListener中,更新Node中每个List的字段。当repaint()出现时,新位置将等待paintComponent()呈现。

@Override
public void paintComponent(Graphics g) {
    …
    for (Node n : nodes) {
        // draw each node
    }

一个名为GraphPanel的完整示例被引用here