3

Swing での描画がどのように機能するかを理解しようとしています。その目的のために、私はOracleのチュートリアルを読んでいます: http://docs.oracle.com/javase/tutorial/uiswing/painting/step3.html

私の質問は単純なものです。同じ関数 (再描画) への 2 つの呼び出しの動作が異なるのはなぜですか? UI デリゲートが以前にペイントした四角形に背景をペイントするのに、新しい領域に新しい四角形をペイントするのはなぜですか? そのための paintComponent() に関する特別な理由はありません。

状況を理解しようとしてhttp://docs.oracle.com/javase/tutorial/uiswing/painting/closer.htmlも読みました。コンポーネントの opaque プロパティと何らかの関係があるようです。このプロパティは、新しい四角形を作成した後に true になるように変更されますか (したがって、前述のように、ui.update() はそれを背景色に設定します)。paintComponent() がそこに新しい四角形を描画しないのはなぜですか?

4

2 に答える 2

3

関数は、さまざまなパラメーターで呼び出されます。

repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
squareX=x;
squareY=y;
repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);

repaint() の最初の呼び出しで、squareX と squareY は以前にペイントされたオブジェクトの位置を示します。2 番目の呼び出しでは、squareX と squareY が現在のマウス位置に変更されます。

repaint() に関するJComponent API ドキュメントから:

コンポーネントが表示されている場合、指定されたリージョンをダーティ リージョン リストに追加します。コンポーネントは、現在保留中のすべてのイベントがディスパッチされた後に再描画されます。

つまり、repaint() の最初の呼び出しは以前の場所をダーティとしてマークし、2 回目は現在の場所をダーティとしてマークします。イベント(moveSquare)が完了すると、paintComponent が再実行され、この 2 つの領域が更新されます。赤い四角形は新しい場所にのみ配置され、古い場所は「空」に更新されます。

于 2012-11-09T15:29:52.457 に答える
1

あなたは、典型的な実装のための不透明なプロパティについて正しいです。特に、次のように述べています。truePanelUIpaintComponent()

スーパーの実装を呼び出さない場合は、不透明なプロパティを尊重する必要があります...不透明なプロパティを尊重しないと、視覚的なアーティファクトが表示される可能性があります。

あなたのコード、 を呼び出すことによって opaque プロパティを尊重しますsuper.paintComponent(g)どちらの呼び出しもrepaint()、描画用の四角形を背景色にクリアします。コンストラクターで別の背景色を設定し、呼び出しをMyPanel省略して効果を確認してみてください。super

public MyPanel() {

    setBorder(BorderFactory.createLineBorder(Color.black));
    setBackground(Color.cyan);
    ...
}

@Override
protected void paintComponent(Graphics g) {
    //super.paintComponent(g);
    g.drawString("This is my custom Panel!", 10, 20);
    ...
}
于 2012-11-09T18:58:46.127 に答える