0

JPanel 内に描画しようとしていますが、クリックするたびに JPanel の背景が消えます。マウスがある場所に線を引きます。2D グラフィックスと何か関係があると思います 誰か助けてくれますか?

public Brush() {

addMouseListener(this);
    addMouseMotionListener(this);
    setBackground(Color.white);


 }
    @Override
    public void paintComponent(Graphics g) {

        Graphics2D g2;
       // super.paintComponent(g);

        g2 = (Graphics2D) g;

        g2.setColor(brushColor);
       g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
        //Ellipse2D.Double circle = new Ellipse2D.Double(p1.x,p1.y,20,20);

        g2.fillOval(p1.x,p1.y,20,20);

        }


        @Override
        public void mousePressed(MouseEvent e) {
            dragging = true;
            p1 = e.getPoint();
            repaint();
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            dragging = false;
            p1 = e.getPoint();
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (dragging) {
                p1 = e.getPoint();
                repaint();
            }
        }
4

1 に答える 1

4

常にsuper.paintComponent(g)オーバーライド内でメソッドを呼び出します。

では、あなたは間違って描いています。たくさんの楕円を描きたい場合は、

  • それらのコレクションを作成し、paintComponent の for ループで描画する、または
  • それらを BufferedImage で描画し、それを paintComponent メソッドで描画します。
  • マウスで曲線を描きたい場合は、通常ArrayList<Point>、paintComponent または BufferedImage のいずれかで を作成し、隣接するポイント間に線を描画します。

繰り返しますが、コードは、paintComponent 内で1 つの点 (実際には楕円形) のみを描画するように記述されています。正しくコーディングされていれば、これですべてです。

最も簡単なことは次のとおりです。

  • あなたのクラスを与えるArrayList<Point>
  • マウスが押されたときにポイントを追加し、再描画を呼び出します
  • paintComponent、スーパー メソッドを呼び出してから、for ループを使用して ArrayList を反復処理します。
  • ポイント 0 ではなくアイテム 1 でループを開始し、前のポイントと現在のポイントの間に線を引きます。
  • より洗練されたものにするために、マウスを押すたびArrayList<ArrayList<Point>>に新しいものを開始し、ArrayList<Point>リリースするたびに終了し、全体のコレクションに追加する場所が必要になる場合があります。これにより、複数の線を引くことができます。

まずは自分でやってみませんか?

于 2013-10-24T16:34:15.303 に答える