2015-11-13 5 views
2

Мне нужно будет получить координаты местоположения всех чертежей, которые я создаю в методе 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

* «Мне нужно будет получить координаты местоположения всех чертежей, которые я создаю ..» * Ummm .. для двух из них вы * поставляете * x любые y, а для другого вы можете хранить 'random.nextInt (500)' в атрибуте уровня класса перед его использованием. Если это не решение этого вопроса, я не понимаю вопроса! –

+0

@AndrewThompson Прошу прощения, я добавил часть таймера наверху. Таким образом, каждый раз, когда таймер галочки позиции меняются. – ocram

+1

См. «Список » в приведенном примере [здесь] (http://stackoverflow.com/a/11944233/230513). – trashgod

ответ

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.