2016-10-21 3 views
-1

JLabel (또는 이미지가있는 JComponent)을 그 위치가 왼쪽 상단 구석이 아닌 이미지의 가운데가되는 방식으로 그립니다.중심의 X, Y 좌표로 JLabel 그리기

나는 fillOvaldrawImage을 사용하려고 시도했습니다. 나는 16x16의 위치를 ​​가진 객체의 모델을 가지고 있고, 스프라이트가 0x0에서 32x32까지 확장되고 16x16에서 48x48로 확장되기를 바란다.

이미지에서 재개되었습니다. getLocation()은 모델의 위치 (즉, 가운데)를 지정해야하며 페인트하려고하면 왼쪽 상단 모서리가 아닌 가운데에 x, y 좌표로 페인트해야합니다.

아이디어가 있으십니까? 내 코드의

enter image description here

일부 비트 :

@Override 
public void update(Observable o, Object arg) { //Is ran everytime WorldControler simulates a tick 
    this.removeAll(); 
    paintCreatures(arg); 
    this.revalidate(); 
    this.repaint(); 
} 

/** 
* 
* @param arg : The LinkedList that notifyObserver passes through in WorldControler 
*/ 
private void paintCreatures(Object arg){ 
    LinkedList<Creature> cList = (LinkedList<Creature>) arg; 
    for(Creature c : cList){ 
     ViewCreature vc = new ViewCreature(c,8); 
     this.add(vc); 
     vc.setVisible(true); 
     vc.setSize(8,8); 
     System.out.println(vc.getX() + " " + vc.getY()); 
    } 
} 

paintComponent에 내가 현재 가지고 :

@Override 
public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.drawImage(img, this.getX()+size/2, this.getY()+size/2, null); 
} 
+0

lable 내 그림 대신 lable을 배치하는 것이 좋습니다. FlowLayout을 사용하여 수행 할 수 있습니다. https://docs.oracle.com/javase/tutorial/uiswing/layout/flow.html –

+0

절대 위치로 작업하고 있으므로 (진화 시뮬레이터이므로 생물이 움직일 것으로 예상됩니다) 픽셀 단위로), 현재'setLayout (null)'을 사용하고 있습니다. 내가 읽은 바로는 JPanel에서 정확한 위치를 지정하는 유일한 방법입니다. 다른 방법이 있습니까? – Docteur

+0

이므로 여기를 참고하십시오. http://www.developer.com/java/other/article.php/893471/Fun-with-Java-Sprite-Animation-Part-1.htm –

답변

0

방법 나는 결국 해결 JPanel의 갱신에 스프라이트를 표시하려고 문제는 setLocation 메소드에서 위치를 오프셋하는 것입니다. 가장 아름다운 답변은 아니지만 지금은 그 일을 할 것입니다.

@Override 
public void setLocation(int x, int y) { 
    super.setLocation(x-(size/2), y-(size/2)); 
} 
@Override 
public void setLocation(Point p) { 
    super.setLocation((int)p.getX()-size/2,(int)p.getY()-size/2); 
} 

이 답변을 개선하기위한 제안이 있으시면 직접 답변 해주십시오. paintComponent를 이것을 오버라이드 할 필요는 없습니다.

관련 문제