0

競合しているように見えるダブル バッファリングと Swing イベントの両方を使用しています。私はJSliderを使用していて、ダブルバッファしようとしています。実際にはダブル バッファリングの描画を行いますが、ダブル バッファリングが再び描画され、イメージが失われます。JSlider を使用してダブル バッファリング描画を行っていますが、イベント システムがフレームを再描画しているようです (2 つのコンポーネント、画像とスライダーを使用)。これを正しい方法で行うにはどうすればよいですか?コンポーネントで再描画しないように通知するように再描画変数を設定しようとしましたが、これは機能しません。特定のコンポーネントの再描画を停止するための何らかのイベント スイッチはありますか? ダブルバッファリングを使用すべきではありませんか? コードスニペットを次に示します。

private void drawOneByOne(ImageComponent imgComponent, JFrame f,
        MapObjects mapObjects, int number) {
    f.createBufferStrategy(2); 

    BufferStrategy bufferStrategy = f.getBufferStrategy();
    Graphics2D g = (Graphics2D)bufferStrategy.getDrawGraphics();            
    bufferStrategy = f.getBufferStrategy();
    g = (Graphics2D)bufferStrategy.getDrawGraphics();
    // draw the map and then the points
    imgComponent.paint(g);
    for (int i = 0; i < number; i++) {
        imgComponent.drawPoint(mapObjects.get(i),g);
    }
    imgComponent.repaint = false;
    bufferStrategy.show();
    g.dispose();
    imgComponent.repaint = true;
}
public void stateChanged(ChangeEvent e) {
    JSlider source = (JSlider)e.getSource();
    if (!source.getValueIsAdjusting()) {
        int voterNumber = source.getValue();
        System.out.println("Drawing One By One, " + voterNumber);
        drawOneByOne(this.imgComponent, this.f, this.mapObjects, voterNumber);
    }
}

. . .

4

1 に答える 1

0

Swing は、それが達成したいすべての場合に簡単にダブルバッファリングされます。setDoubleBuffered(true)ダブルバッファリングに問題はありません。メモリをより多く使用するだけで、swing コンポーネントの親コンテナで呼び出すことができます。を制御することはできません.JFramerepaintを呼び出さない限り、OSは必要と判断したときにいつでもそれを呼び出しますsetIgnoreRepaint

于 2013-06-09T16:47:09.083 に答える