2016-05-12 7 views
4

JPanelに複数の線を描画しようとしています。私のコードでは、各行をArrayListに追加してから、forループを繰り返して各行を描画します。しかし、私は代わりに、この奇妙な出力を取得します。JPanelで複数の線を描画する際のエラー

これは私のコードです:

public class DrawPanel extends JPanel { 

    /** Generated serial ID for the program. */ 
    private static final long serialVersionUID = 1697489704611349844L; 

    /** The width of the panel. */ 
    private static final int WIDTH = 600; 

    /** The height of the panel. */ 
    private static final int HEIGHT = 300; 

    /** The stroke width in pixels. */ 
    private static final int STROKE_WIDTH = 1; 

    /** x-coordinate when mouse is first clicked. */ 
    private int myX; 

    /** y-coordinate when mouse is first clicked. */ 
    private int myY; 

    /** x-coordinate when mouse is clicked for a second time. */ 
    private int myXEnd; 

    /** y-coordinate when mouse clicked for a second time. */ 
    private int myYEnd; 

    /** ArrayList of lines drawn. */ 
    private List<Line2D> myLines = new ArrayList<Line2D>(); 

    /** ArrayList of coordinates to draw with a pencil. */ 
    private List<MouseEvent> myPoints = new ArrayList<MouseEvent>(); 


    /** 
    * Constructs a new ellipse panel. 
    */ 
    public DrawPanel() { 
     super(); 
     setBackground(Color.WHITE); 
     setPreferredSize(new Dimension(WIDTH, HEIGHT)); 
     addMouseListener(myMouseHandler); 
     addMouseMotionListener(myMouseMotionHandler); 
     setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
    } 

    /** 
    * MouseMotionListener for drawing a shape. 
    */ 
    private final MouseMotionListener myMouseMotionHandler = new MouseMotionAdapter() { 

     @Override 
     public void mouseDragged(final MouseEvent theEvent) { 
      myXEnd = theEvent.getX(); 
      myYEnd = theEvent.getY(); 
      myPoints.add(theEvent); 
      repaint(); 
     } 

//  @Override 
//  public void mouseMoved(MouseEvent e) {   
//  } 

    }; 

    /** 
    * MouseListener for drawing a shape. 
    */ 
    private final MouseListener myMouseHandler = new MouseAdapter() { 
     @Override 
     public void mousePressed(final MouseEvent theEvent) { 
      myX = theEvent.getX(); 
      myY = theEvent.getY(); 
      myXEnd = theEvent.getX(); 
      myYEnd = theEvent.getY(); 
      repaint(); 

     } 

     @Override 
     public void mouseReleased(final MouseEvent theEvent) { 
      myXEnd = theEvent.getX(); 
      myYEnd = theEvent.getY(); 

      myPoints.add(theEvent); 
      repaint();    
     } 
    }; 

    /** 
    * Draws line with drawLine method. 
    */ 
    @Override 
    public void paintComponent(final Graphics theGraphics) { 
     super.paintComponent(theGraphics); 
     final Graphics2D g2d = (Graphics2D) theGraphics; 

     // for better graphics display 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 

     g2d.setPaint(new Color(51, 0, 111)); 
     g2d.setStroke(new BasicStroke(STROKE_WIDTH)); 

     myLines.add(new Line2D.Double(myX, myY, myXEnd, myYEnd)); 

     for (Line2D l : myLines) { 
      g2d.draw(l); 
     } 
    } 
} 

そして、ここでは、私が円形にカーソルを移動すると、それはパネルに描くものです。それは中心点で接続された一連の線です。しかし、私はそれが複数の別々の行を描くことができるようにしたい。 [1]

これは、描画したい線のタイプですが、描画されていない線がいくつも消えています。したがって、私はArrayListを実装して、パネル上にそれらを保持するために線を再描画するのはなぜですか?

[2]

+1

何が起こると思われますか?あなたは自由な形の鉛筆の描画をしたいように思えます。 – matt

+0

私はそれが別々の行であることを望みます。私は1行を描くことができますが、もう1つ描くと消えます。私はすべての行がパネル上に存在するようにしたいと思います。 – Jasmine

+0

「フリーフォーム」の鉛筆画は別々の線ですが、非常に短いです。 – matt

答えて

1

私はラインが消えている理由は、このコードには示されていないと思います。ここで私はそれを更新する方法です。

@Override 
    public void mouseDragged(final MouseEvent theEvent) { 
     myXEnd = theEvent.getX(); 
     myYEnd = theEvent.getY(); 
     repaint(); 
    } 

    @Override 
    public void mousePressed(final MouseEvent theEvent) { 
     myX = theEvent.getX(); 
     myY = theEvent.getY(); 
    } 

    @Override 
    public void mouseReleased(final MouseEvent theEvent) { 
     myXEnd = theEvent.getX(); 
     myYEnd = theEvent.getY(); 
     myLines.add(new Line2D.Double(myX, myY, myXEnd, myYEnd)); 
     repaint();    
    } 
}; 

/** 
* Draws line with drawLine method. 
*/ 
@Override 
public void paintComponent(final Graphics theGraphics) { 
    super.paintComponent(theGraphics); 
    final Graphics2D g2d = (Graphics2D) theGraphics; 

    // for better graphics display 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
         RenderingHints.VALUE_ANTIALIAS_ON); 

    g2d.setPaint(new Color(51, 0, 111)); 
    g2d.setStroke(new BasicStroke(STROKE_WIDTH)); 

    g2d.draw(new Line2D.Double(myX, myY, myXEnd, myYEnd)); 

    for (Line2D l : myLines) { 
     g2d.draw(l); 
    } 
} 

これは2点の間に1行を描き、マウスが離されるまで線を保存しません。実際に鉛筆のように描画したい場合は、マウスドラッグされたメソッドに新しい行を追加してください。

+0

私はあなたの提案を実装し、それは(ほとんど)働いた。マイナーなエラーがあり、新しいラインを描いたが、すべてが左上隅にスタートポイントを持っていた。しかし、私はそれを修正し、今それが動作するので、ありがとう! – Jasmine

+0

しかし、ユーザーは新しい線が描画されているのを見たいと思うでしょう。 buttonUpイベントまで表示されないときは、水平線を描画してみてください。 – FredK

関連する問題