2012-04-18 8 views
2

マウスをドラッグしたときにJPanelに2以上の線を描きたい。私は私のコードでsuper.paintComponent(g) を使用する場合、私はsuper.paintComponent(g)を使用していないがとき、私は、パネル上の2線を描くことができませんでした;、結果は以下のPICのような、醜いです:マウスをドラッグしたときにJpanelに線を描く

enter image description here

Iなぜその行がそのように振る舞ったのかを理解する。

マウスをドラッグしてJpanelに線を描画するにはどうすればよいですか? ところで、g2d.draw(line2d)によって描かれた線は、時にはそれが滑らかな線ではない(以下PIC)

enter image description here

マイコードこれまで:

import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 
import java.awt.geom.Line2D; 
import java.util.ArrayList; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 


public class LineDrawing extends JPanel implements MouseMotionListener, MouseListener{ 
    Point point1; 
    Point point2; 
    Line2D line2d; 

    public LineDrawing(){ 
     super(); 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 

@Override 
    public void paintComponent(Graphics g){ 

    //super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D) g; 
     if(point1!=null && point2!=null){ 

      g2d.setPaint(Color.RED); 
      g2d.setStroke(new BasicStroke(1.5f)); 
      g2d.draw(line2d); 

     } 
     } 


    @Override 
    public void mouseDragged(MouseEvent e) { 

    point2 = e.getPoint(); 
    line2d = new Line2D.Double(point1, point2); 
    repaint(); 

    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    point1 = e.getPoint(); 

    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

    } 

@Override 
public void mouseEntered(MouseEvent e) { 

} 

@Override 
public void mouseExited(MouseEvent e) { 

} 


public static void main(String a[]){ 
    EventQueue.invokeLater(new Runnable(){ 
     @Override 
     public void run() { 

     JFrame frame = new JFrame(); 
     LineDrawing linedraw= new LineDrawing(); 
     frame.add(linedraw); 
     frame.setSize(500,500); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

         } 
       }); 
    } 

}

答えて

4

..draw 2線

これはこの問題の要点のようです。

クリック/ドラッグすると、展開可能なリスト(たとえばArrayList)に一連の行を保存し、リストに新しい行を追加してrepaint()に電話してください。 paintComponent(Graphics)では、コレクションを繰り返し、各行を描画します。

私はあなたがこれをテストしている間あなたのウィンドウを最小化して復元していないと推測しています。あなたのライン(美しいか醜い)は消えるでしょう!


..theyは姿を消しました。どういう理由ですか?

paint()paintComponent()のメソッドは、GUIを再描画する必要があるときはいつでも呼び出されます。アプリの前に別のウィンドウが表示された後に呼び出されることがあります。その後、フロントに戻ります。別の時間は、最小化から復元された後です。行を保持する

オプションは次のとおり

  • ストア線の位置(S)と尋ねたときはいつでも(上記のように)それらのすべてを再描画します。これはほとんどの目的で機能します。何百行もある場合でも、GUIは「目の瞬き」でそれらを再描画します。
  • 各行をBufferedImageに描画し、画像をJLabelに(ImageIconに)入れます。この方法は、描画領域が固定サイズの場合にはうまくいきます。&何も削除されず、線、円弧、半透明領域、小さな画像、テキストの数々に対応できます。画像をレンダリングサーフェスとして使用すると、 ArrayListは必要ありません。イメージに新しい行を追加し、ラベルを再描画して新しい行とすべての前の行を表示するだけでよいからです。

..theラインは直線ではありません。

これは、線を描画するときに使用される「レンダリングヒント」のためです。整列したピクセルの行からなる画面は、垂直線または水平線のみを完全に作ることができます。直線の「錯視」を他の角度で連続線に与えるには、ditheringという技術が必要です。 RenderingHintsの説明と説明については、Graphics2Dのオープニングセクションをご覧ください。

+0

あなたは正しく、消えました。どういう理由ですか? –

+0

ありがとうございます。 BTW、paintComponentによって描画される線。滑らかな線ではありません。どうすればそれを取り除くことができますか? –

+0

私は質問を編集したので、写真で見ることができます - 線は直線ではありません。私はいくつかの行ではなく、すべての行を意味します。 –

1

私はあなたの質問を得るが、あなたは連続した線を描きたい場合はわからない。ドラッグすると、最後のポイントを更新する必要があります。

@Override 
    public void mouseDragged(MouseEvent e) { 
    point2 = e.getPoint(); 
    line2d = new Line2D.Double(point1, point2); 
    point1 = point2; // add this line 
    repaint(); 
    } 
+0

私は連続線を描画したくない、私はセパレート線をしたい.. –