0

滑らかな接続線を描画する必要があるアプレットを作成しています。この線で実行しています (ユーザーはペンの幅を入力しています)。

    public void mouseDragged(MouseEvent arg0)
    {   
    g.setColor(kolor);
    int width=Integer.parseInt(szPedzel.getText());
    g.fillOval(arg0.getX(), arg0.getY(), width, width); 
    }

ここで、g = this.getGraphics();

少しゆっくり描いているときは良いのですが、速く描いていると単一の楕円が表示されます。この楕円を切り離す方法はありますか?

img: http://i42.tinypic.com/1536x04.png

4

4 に答える 4

2

いいえ、次のように描きたくありません。

public void mouseDragged(MouseEvent arg0)
{   
  g.setColor(kolor);
  int width=Integer.parseInt(szPedzel.getText());
  g.fillOval(arg0.getX(), arg0.getY(), width, width); 
}

どこg = this.getGraphics();

コンポーネントで使用するgetGraphics()と、取得された Graphics オブジェクトの有効期間が短くなり、結果として得られるすべての画像が適切に描画されないリスクがあります。信じられない?次に、実行中に GUI を最小化して復元し、楕円が消えるのを確認します。

代わりに、次のことをお勧めします。

  • 描画コンポーネントにArrayList<Point>
  • GUI のpaintComponent(Graphics g)メソッド (これが Swing GUI の場合) で、List を反復処理して、各点の間に線を引きます。
  • MouseMotionListener で、Points を List に追加して を呼び出しますrepaint()
  • より太い線が必要な場合は、Graphics オブジェクトを Graphics2D オブジェクトにキャストして呼び出しsetStroke(Stroke s)、太さ > 1 の BasicStroke オブジェクトを渡します。

  • たとえば、このリンクをチェックしてください。

于 2013-12-14T22:07:53.070 に答える
1

getGraphicsこれは、カスタム ペインティングが行われる方法ではありません。

nullこれは、最後のペイント サイクルでペイントされた内容のスナップショットに過ぎず、次のペイント サイクルで内容が破棄される可能性があるため、信頼できません。

paintComponentカスタム ペインティングは、コンポーネントのメソッドをオーバーライドすることで実現できます。JComponent

詳細については Performing Custom Painting とPaint in AWT and Swing を参照してください。Swing/AWT でカスタム ペインティングを実行したい人は、その仕組みを知っているはずです。

例えば_

于 2013-12-14T22:07:36.820 に答える
0

以前のマウスの位置を記憶してから、古い位置と新しい位置の間のすべての点で楕円を描く必要があります....

...または、線を引く関数が必要なことを実行できるかどうかを確認し、そこで同じことを実行します。

于 2013-12-14T22:02:04.143 に答える
0

マウスは一度にピクセル単位で移動しません。より速く進むために、いくつかスキップします。間に楕円を描きたい場合は、「線画」の方法を使用して、空のスペースに楕円を描くことをお勧めします。

ピクセルがスキップされると、実際には滑らかさが得られません。それを行うアルゴリズムはかなり複雑になります。
できる最善の方法は、間に楕円形の線を引くことです。「マウスグラブ」が最後に使用された点を思い出してください。

于 2013-12-14T22:07:43.243 に答える