2016-10-21 3 views
-1

Я пытаюсь нарисовать JLabel (или JComponent с изображением) таким образом, чтобы его местоположение было центром изображения, а не левым верхним углом.Рисование JLabel с координатой X, Y центра

Я пытался использовать fillOval и drawImage безрезультатно. У меня есть модель объекта, которая имеет позицию 16x16, и я хочу, чтобы спрайт охватывал от 0x0 до 32x32, а не от 16x16 до 48x48.

Возобновление на изображении: getLocation() должен дать мне позицию модели (т. Е. Центр), и когда я пытаюсь рисовать, он должен рисовать координаты x, y в центре, а не в верхнем левом углу.

Любая идея?

enter image description here

Некоторые биты моего кода: JPanel пытается отобразить спрайтов на обновление:

@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

Я бы порекомендовал позиционировать листок, а не изображение в листе. Это можно сделать с помощью 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

Путь В конце концов я решил проблема заключается в смещении местоположения в методе 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 этим.

Смежные вопросы