1

マウスリスナーを使用してペンツールを作成しようとしています:

public void mouseDragged(MouseEvent e) {
            imageL.setCoordinates(originalPos, e.getPoint());
            imageL.repaint();
            originalPos = e.getPoint();
        }

JLabel (imageL) のペイント関数は、マウスのドラッグに基づいて線を描画できる 2 つのポイント セットを受け取ります。唯一の問題は、ドラッグが実行されるたびに、新しいレイヤーに前回のマウス ドラッグで描画された線が含まれないことです。JLabel のペイント機能は次のとおりです。

public void paint(Graphics g) {
    super.paint(g); 
    Graphics2D g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(drawingColour);
    g2d.drawLine(originCors.x,originCors.y,endCors.x,endCors.y);
}

基本的に私の質問は次のとおりです。新しい行を現在のレイヤーに「追加」するにはどうすればよいですか?

どんな助けでも素晴らしいでしょう、前もって感謝します

4

2 に答える 2

3

コンポーネントのボーダーと子のすべての描画を処理する予定がない限り、paint メソッドではなく、JComponent の (そして JLabel は JComponent から拡張された) paintComponent メソッドで描画します。次に、描画コンポーネントに Point の ArrayList を保持させ、mouseDragged メソッドでこの配列リストに Point を追加することができます。その後、paintComponent メソッドはリストを繰り返し処理し、すべての行をペイントできます。1 つの線を描画するだけの場合は、描画 JLabel にクラス フィールド内の両方のポイントを保持させます。

于 2011-05-07T01:04:03.960 に答える
2

マイケル、

まず、Swing (JLabel は、古い AWT ライブラリに追加された Swing コンポーネントです) では、paintComponentメソッドをオーバーライドすることをお勧めします (「ペイント」メソッドではありません)。その方法と理由については、Java チュートリアル: カスタム ペインティングを参照してください。

行のリストをカスタムペイントしたい場合は、「新しい」ものだけでなく、それを行う必要があります。これを回避する1つの方法は、新しい行ごとに画像を「更新」し、それをカスタムペイントすることです...これは、より多くのメモリを使用するという犠牲を払って、各行を1回だけ「ペイント」するため、わずかに高速です(維持するため) 「背景画像」)...しかし、この手法は「ダブルバッファリング」に役立ちます。これにより、画面に直接描画するときに発生する「ちらつき」が回避されます。詳細については、Java チュートリアル: 画像の操作を参照してください。それは実際にはかなり簡単です。

「Java ダブル バッファリングの例」をグーグルで検索することをお勧めします (Rose India は避けてください。がらくたでいっぱいです)。

乾杯。キース。

于 2011-05-07T01:18:50.803 に答える