2016-10-28 7 views
1

私は、楕円を描き、ボタンを一度押すだけでスクリーンにステップバイステップ移動させるという仕事を大学に持っています。私は各時間は、依然として楕円だけ位置を描画することなく、最後の反復で定義されている点に原点から根本的移動サイクル中に()関数の再描画を呼び出すことがJavaでキーを1回押してシェイプを移動する方法は?

public class Window extends JPanel { 

private static Ellipse2D.Double Ellipse; 
private JFrame frame; 

public Window() { 
    super(); 
    int width = 20; 
    int height = 30; 
    Ellipse = new Ellipse2D.Double(width, height, 100, 50);   
} 

public Dimension getPreferredSize() 
{ 
    return (new Dimension(frame.getWidth(), frame.getHeight())); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponents(g); 
    Graphics2D brush = (Graphics2D) g; 
    int width = getWidth(); 
    int height = getHeight(); 
    g.clearRect(0, 0, width, height); 
    brush.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    brush.draw(Ellipse); 
} 
public class MoveCircle implements KeyListener, ActionListener { 

    @Override 
    public void keyPressed(KeyEvent e) { 
     System.out.println("Working on top!"); 
     double newX = 0; double newY = 0; 
     if (e.getKeyCode() == Event.ENTER) {     
      for (int i = 0; i < 26; i ++) 
      { 
       System.out.println("Working on bottom!"); 
       newX = Ellipse.x + 10; 
       Ellipse.x = newX; 
       newY = Ellipse.y + 10; 
       Ellipse.y = newY; 
       repaint();     
      }     
     } 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 

    } 
} 
private void createAndDisplayGUI(Window window) 
{ 
    frame = new JFrame(); 
    Container container = frame.getContentPane();  
    container.add(window); 
    window.addKeyListener(new MoveCircle());   
    frame.setSize(400, 400); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setVisible(true); 
    window.requestFocusInWindow(); 
} 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      Window window = new Window(); 
      window.createAndDisplayGUI(window); 
     } 
    }); 
} 

}

:ここに私のコードであります各反復で楕円の スイングタイマーを使用して、各反復で楕円を再描画することはできますか?私はこれで助けを得ることを非常にうれしく思うでしょう。

+1

の下に一緒に入れてきたように、あなたは、Swingのタイマーでこの問題を解決することができ;' 'TimerTask'が複数回使用することはできません –

+2

@RomanGräf :EDTで寝ないでください。 _do_ [*スイングタイマーの使用方法*](http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html)を参照してください。 – trashgod

答えて

3

2つの問題があります。まず、ループがUIスレッドで実行されていることです。もう一つは、再塗装の仕方の誤解です。すべての再描画は、返すためにUIスレッドに要求を追加します。それ自体の中で再描画を実行しません。したがって、UIスレッドで操作を実行している場合は、複数回呼び出しても効果はありません。あなたが示唆したように、私はあなたが `のThread.sleep()を使用することができます

ActionListener al = new ActionListener() { 
    int iterations = 0; 
    public void actionPerformed(ActionEvent ae) { 
      if (iterations == 25) { 
      timer.stop(); 
      } 
      interations++; 
      System.out.println("Working on bottom!"); 
      newX = Ellipse.x + 10; 
      Ellipse.x = newX; 
      newY = Ellipse.y + 10; 
      Ellipse.y = newY; 
      repaint();     
    } 
}; 

final timer = new javax.swing.Timer(delay, al); 
timer.start(); 
+1

愚かな質問を申し訳ありませんが、それはSwingを使った私の最初のプロジェクトの1つです。それでどの方法で特に私はそれを書くべきですか? –

+0

これは、ループするコードの元になるkeyPressedメソッドに入る必要があります。また、私が提示したコードでは、Timer.stop()への呼び出しを省略しました。あなたは26の反復をした後で必ずタイマーを.stop()する必要があります。 – ControlAltDel

+0

忍耐力ありがとうございました:)それは本当に私を助けました。ありがとうございました。 –

関連する問題