2

this 内に形状を描画していますJPanelが、これは別の main 内にもありJPanelます。1repaint()ミリ秒だけ形状を描画し、その後消えます。ペイントされたままにならないのはなぜですか?

私のpaintComponent方法はこのようなものです

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    for (int i = 0; i < reportElements.size(); i++) {
        this.reportElements.get(i).display((Graphics2D) pageComponents.get(i).getGraphics());

    }
}

親が有効になっている場合JEditorPanesetEditable()それは機能し、形状を見ることができますが、それが の場合JPanel、ミリ秒後に空のパネルしか表示されません。

4

4 に答える 4

3

それを永続的にするには、JPanel の Graphics オブジェクトにペイントする必要があります...あなたの例では、それはGraphics g...

于 2010-03-09T15:37:24.843 に答える
2

この場合、小さな JPanel である pageComponents はどうなるでしょうか? 親パネルはそれらに形状を描画するつもりはありませんか?

私はあなたのコメントを理解しているかどうか確信が持てません。メイン パネルには子パネルを含める必要があります。子パネルは、レイアウト マネージャーを使用してメイン パネルに追加する必要があります。次に、Swing がメイン パネルの再描画を決定すると、すべての子パネルも再描画され、次に子パネルがそこにある形状を再描画します。

Custom Paint Approachesには、パネルに図形を描画する実際の例があります。

于 2010-03-09T16:49:37.070 に答える
2

ウルトラジョンは死んでいます。Graphics渡されたものを使用する必要があります。その理由を読んでください...

Java 1.6 では、RepaintManager再描画要求の最適化をサポートする が導入されました。絵画に微妙な影響を与えます。

この場合、複数の Graphics2D オブジェクトを操作しています:g渡された値と呼び出しpaintComponentによって返された値です。getGraphics

リペイント マネージャーはg、ペイントするものをあなたに渡しました。注: これは画面ではなく、一時的なバッファに描画されます (デフォルトのダブル バッファリングを想定)。

呼び出しでは、さまざまなコンポーネントpaintComponentから取得したグラフィックスにペイントしています。getGraphicsこれは、再描画マネージャーをバイパスし、バッファリングされていないディスプレイに直接描画します。

paintChildren戻ると、 がRepaintManager起動してダブル バッファの更新を処理します。表示されたバッファの上に空白の一時バッファをペイントし、から取得したグラフィックス オブジェクトを通じてペイントされたものを効果的に消去します。getGraphics

于 2010-03-09T16:00:33.893 に答える
0

それは、メソッドで描画したものが何であれ、それpaintChildrenまたはオーバードローである可能性があります。おそらく、代わりにpaintBorderオーバーライドしてみてください。paintそこで、コンポーネントに何をペイントするかを完全に制御でき、さらに呼び出すか、まったく呼び出すかを自分で決めることがpaintComponentできpaintChildrenますpaintBorder

于 2010-03-09T15:00:52.053 に答える