1

私は Java で書かれた並行キャンバスに取り組んでいます。これにより、ユーザーは並行してキャンバスに描画していると思うようになります。

ユーザーが認識する並列処理を実現するために、これらの Runnable オブジェクトを作成してもらい、SwingUtilities.invokeLater() を使用して EventQueue に配置します。

それをテストするために、いくつかのスレッドを使用してユーザーをシミュレートし、invokeLater() への各呼び出しの間に少しの遅延 (約 50 ミリ秒) を追加して、実際に描画が並行して行われているように見えるかどうかを確認しました。

問題は、invokeLater() 呼び出しの間に遅延が追加されても問題なく動作していましたが、その遅延を取り除くと、描画が適切に描画されることもあれば、部分的に描画されたり消えたりすることもあれば、描画されないこともあります。

私は何がうまくいかないのかについてかなり困惑しているので、誰かが何かアイデアを持っているなら、私に知らせてください。

以下は、遅延をコメントアウトしたコードです。

public void run(){
    //add tasks on to the event queue of the EDT 
    for(int i = 0; i<numLines; i++){
        DrawLineTask task = new DrawLineTask(g, x1, y1+i, x2, y2+i, lineColor);
        SwingUtilities.invokeLater(task);
//          try {
//    Thread.sleep(new Double(Math.random()*50).longValue());//random sleeping times to             make it appear more realistic
//          } catch (InterruptedException e) {
//              e.printStackTrace();
//          }
    }

乾杯

編集:要求された DrawLineTask のコードは次のとおりです。指定されたパラメーターで標準の Java 関数を使用して線を描画する Runnable クラスの単なる拡張であるため、非常に単純です。

public class DrawLineTask implements Runnable {
Graphics g;
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
Color color = Color.BLACK;

public DrawLineTask(Graphics g, int x1, int y1, int x2, int y2){
    this.g = g;
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
}

public DrawLineTask(Graphics g, int x1, int y1, int x2, int y2, Color color){
    this.g = g;
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
    this.color = color;
}

@Override
public void run() {
    g.setColor(color);
    g.drawLine(x1, y1, x2, y2);
}

}
4

1 に答える 1

4

私の知る限り、 Graphics オブジェクトへの参照を保持して、必要なときに描画することは想定されていません。代わりに、paintComponent()メソッドが Swing によって呼び出されるのを待って、このメソッドで描画を行うことになっています。

したがって、タスクはコンポーネントの状態を変更するだけで、非同期または同期の再描画を要求する必要があります (repaint()またはを使用paintImmediately())。paintComponent()Swing は、コンポーネントの状態に基づいて、適切な線を描画するために使用できる Graphics オブジェクトを使用してメソッドを呼び出します。

詳細と説明については、http://java.sun.com/products/jfc/tsc/articles/painting/を参照してください。

于 2012-06-02T22:13:41.193 に答える