2017-03-26 3 views
0

私は線を作成したい、2秒後に別の線を壊すなどしたい。 もし私が行を描画し、Thread.sleep()でプログラムの実行を一時停止し、paintComponent()メソッド内で再び線を描画すると、最初にプログラムが2秒間停止してから、両方の線が同時に描画されます。 この問題を解決するにはどうすればよいですか?一度にすべてではなく時間がたつにつれて図形を1つずつ描画する

+0

をペイントするために必要な情報を提供するために、1つ以上のモデルに依存しなければならないことはゲームループで、可能な限り論理的な意思決定に焦点を当てべきではありません。 –

+0

私は知っています。私はこれらのことをC++ Sfmlライブラリで作業していました。しかし、スイングでは、私は別のパラメータ(例えば、パラメータとして描く線なし)でゲームループ内で何度もJPanelオブジェクトを作成する必要がありますか? –

+0

パネルを再作成する必要はありませんが、paintComponent()を呼び出すたびにシーン全体が再描画されます。タイミングは、paintComponent()メソッド内から行う必要があります。 – James

答えて

3

これは現実的な一貫性の要件と問題です。基本的な問題の解決方法に関する基本的な情報は、Concurrency in SwingHow to use Swing Timersをご覧ください。

また、あなたが集中したいコア設計の選択肢があるSwingで

をどのように絵画作品の詳細については、Painting in AWT and SwingPerforming Custom Paintingを見ている必要があります:

  1. イベントをふさがないでくださいスレッドをディスパッチすると、何も描画されない、または新しいイベントに応答することが防止されます。
  2. EDTのコンテキスト外でUIを更新しないでください。
  3. ペイントは状態をペイントする必要があります。その代わり、それはそれを、それはあなたが必要なもの、それ自体が

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Line2D; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private List<Shape> shapes; 
     private int yPos = 0; 

     public TestPane() { 
      shapes = new ArrayList<>(25); 

      Timer timer = new Timer(2000, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        yPos += 10; 
        Line2D line = new Line2D.Double(0, yPos, getWidth(), yPos); 
        shapes.add(line); 
        repaint(); 
       } 
      }); 
      timer.setInitialDelay(2000); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      for (Shape line : shapes) { 
       g2d.draw(line); 
      } 
      g2d.dispose(); 
     } 

    } 

} 
関連する問題