0

絵を描きたいパネルがあります。作成途中での塗装も問題ありません。

canvas = new Panel() {
    public void paint(Graphics g) {
        g.setColor(Color.WHITE);
        g.drawLine(0, 0, 10, 10);
    }
};

しかし、実行時に描画したいと思います。本能的に、私は次のようなものを作成しました:

Graphics g = canvas.getGraphics();
g.setColor(Color.GREEN);
g.drawLine(10, 10, 20, 20);
canvas.paint(g);

残念ながら、これは機能しません。これはおそらく簡単な質問ですが、検索しても満足のいく結果が見つかりません。では、どうすればやりたいことができるのでしょうか。


上の質問で申し訳ありません。ボタンクリックイベントにペイントコードを追加したところ、動作しました。親フレームの windowOpened イベントでは機能しません。理由はありますか?

4

2 に答える 2

2

問題は、ウィンドウ システム (または OS) が特定のグラフィカル コンポーネントを画面に再描画する必要があると判断したときに、いつでも paint() メソッドを呼び出すことができることです。これはいつでも発生する可能性があります (ほとんどの場合、ウィンドウのサイズ変更、移動、切り替えなど)。どのくらいの頻度で発生するかを確認するには、paint() メソッドの先頭にログ メッセージを追加します。キャンバスに何かを一度だけペイントすると、ペイントされている可能性が非常に高くなりますが、OS/ウィンドウシステムから別の再ペイント要求が発生し、オブジェクトの paint() によって緑色の線が「上書き」されます。したがって、カスタム ペインティングはすべて paint() で行う必要があります。サブクラスに追加の属性を追加し (boolean drawGreenLine など)、paint() でチェックして、次のような適切なアクションを実行できます。

class MyPanel extends JPanel {

    boolean drawGreenLine;

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.WHITE);
        g.drawLine(0, 0, 10, 10);
        if (drawGreenLine) {
            g.setColor(Color.GREEN);
            g.drawLine(10, 10, 20, 20);

        }  
    }
};

編集: @MadProgrammer によって提案されたように、例は paintComponent() をオーバーライドするように変更されました。このように、コンポーネントはそれ自体を描画することのみを担当します (子や境界線は描画しません)。

于 2012-09-24T10:03:49.890 に答える
0

g.dispose()GraphicsContext のリソースを解放してみてください

于 2012-09-24T10:11:04.253 に答える