JPanel에서 별도의 스레드로 도형을 그립니다. 이 모양을 호출하는 방법을 통해 move()
이동하려는 있지만 그림의 위치를 변경하지 마십시오.Java에서 도형을 이동하는 방법은 무엇입니까?
이 내 CustomShape 콘솔에
public class CustomShape {
private static final int Y_STEP = 5;
private static final int X_STEP = 5;
public String name;
public Shape shape;
public Color color;
private Point newLocation;
public void move() {
newLocation.x += X_STEP;
newLocation.y += Y_STEP;
//How set new location ?
//It doesn't work
this.shape.getBounds().setLocation(newLocation);
System.out.println(String.format("New location is [%d,%d]",newLocation.x, newLocation.y));
System.out.println(String.format("Move to [%d,%d]", this.shape.getBounds().getLocation().x, this.shape.getBounds().getLocation().y));
}
public CustomShape(Shape shape, Color color, String name) {
this.shape = shape;
this.color = color;
this.name = name;
newLocation = this.shape.getBounds().getLocation();
}
샘플 출력
New location is [15,15]
Move to [10,10]
New location is [20,20]
Move to [10,10]
New location is [25,25]
Move to [10,10]
내 JPanel의
public class ViewPanel extends JPanel {
private static final long serialVersionUID = 5252479726227082794L;
private List<CustomShape> shapeList = new ArrayList<CustomShape>();
private Map<String, Thread> threads = new HashMap<String, Thread>();
private Timer timer;
private static final int TIMER_SPEED = 1000;
public ViewPanel() {
super();
this.setDoubleBuffered(true);
timer = new Timer(TIMER_SPEED, null);
timer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
testMove();
}
});
}
private void testMove() {
for (CustomShape shape : shapeList) {
shape.move();
}
}
public void startMove() {
timer.start();
}
public void stopMove() {
timer.stop();
}
public void addShape(CustomShape shape) {
shapeList.add(shape);
if (!threads.containsKey(shape.getName())) {
Thread t = new Thread(new DrawThread(shape, this.getGraphics()),
shape.getName());
threads.put(shape.getName(), t);
t.start();
}
this.repaint();
}
public void removeShape(CustomShape shape) {
if (threads.containsKey(shape.getName())) {
Thread t = threads.remove(shape.getName());
t.interrupt();
shapeList.remove(shape);
}
this.repaint();
}
}
스레드 무승부 모양에 대한
public class DrawThread implements Runnable {
private static final int THREAD_SLEEP = 100;
private CustomShape shape;
private Graphics2D g2d;
private boolean interrupted = false;
public DrawThread(CustomShape shape, Graphics g) {
this.shape = shape;
this.g2d = (Graphics2D)g;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(THREAD_SLEEP);
g2d.setColor(this.shape.getColor());
g2d.draw(this.shape.getShape());
} catch (InterruptedException e) {
System.out.println(String.format("interrupt %s", Thread
.currentThread().getName()));
interrupted = true;
} finally {
if (interrupted)
break;
}
}
}
}
당신은 운동 기능의 다시 그리기 통화를 놓쳤다 : 여기
는 코드입니다. – zeller
스레드의 구성 요소를 다시 그립니다. 왜'this.shape.getBounds(). setLocation (newLocation);'가 위치를 변경하지 않는가? – BILL
addShape 및 removeShape에있는 것들을 제외하고는 다시 그리기 호출을 볼 수 없지만 당신 말이 옳았는데 눈치 채지 못했습니다. 이 질문을보십시오 : http://stackoverflow.com/questions/3695673/why-doesnt-setlocation-move-my-label 아마도 도움이 될 것입니다. – zeller