2012-04-20 4 views
0

Я хочу переместить изображение по экрану на 16 вправо при нажатии клавиши со стрелкой. Я хочу переместить его со скоростью (1px/10ms), пока не достигнет точки. Изображение создается внутри класса, являющегося дочерним элементом JPanel. Я написал следующий код, но изображение меняет положение ползунков вместо создания движения:Перемещение изображения с помощью Swing

public class Test extends JFrame implements KeyListener { 
    private int x=0; 
    private int y=0; 
    BufferedImage img; 
    ... 
    ... 
    public void paint(Graphics g){ 
     g.drawImage(img,x,y,null); 
    } 
    // Move to a point 16 pixels to right 
    public void moveRight(){ 
     for(int i=0;i<16;i++){ 
      x++; 
      repaint(); 
      try { 
       Thread.sleep(10); // Sleep 10 milliseconds until next position change 
      }catch (InterruptedException e) {} 
     } 
    } 

    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode()==KeyEvent.VK_RIGHT){ 
      moveRight(); 
     } 
    } 
} 

ответ

4

Проблема заключается в вашем сне внутри EDT (Event-диспетчерский-Thread). repaint() запускает событие, которое будет отправлено EDT, и, в свою очередь, выполнит фактическую перерисовку вашего компонента. Поскольку вы блокируете EDT, перерисовка не выполняется напрямую (но после завершения всего вашего кода происходит одно событие перерисовки (поскольку события перерисовки по возможности сгруппированы). Возможно, вам понадобится использовать SwingWorker, чтобы исправить эту проблему.

+4

+1 «javax.swing.Timer», показан [здесь] (http: // stackoverf low.com/q/9849950/230513), является альтернативой 'SwingWorker' в этом контексте. – trashgod

2

Что делать, если вы звоните moveRight() в другом потоке

попробовать это:

public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode()==KeyEvent.VK_RIGHT){ 
     new Thread(new Runnable(){ 
      public void run(){ 
       moveRight(); 
      } 
     }).start(); 
    } 
} 

Я не проверял, и я даже не знаю, если это хороший

Подход
Смежные вопросы