8

試みは、 awt canvas でマウスを使用して図形(今のところ線)を描画できるようにすることです。初めて Java グラフィックスを試しています。どうすればいいのかわからない。これは私の最初の試みです:

package def.grafi;

import java.awt.Canvas;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

  public class Dra {
  Frame f = new Frame();

public void disp() {
    f.setBounds(100, 100, 200, 200);
    MosL ml = new MosL();
    Can c = new Can();
    f.add(c);
    c.addMouseListener(ml);
    c.addMouseMotionListener(ml);
    f.setVisible(true);
}

public static void main(String[] args) {
    Dra d = new Dra();
    d.disp();
}

public class MosL extends MouseAdapter {
    int sx = 0;
    int sy = 0;
    boolean onDrag = false;

    @Override
    public void mouseDragged(MouseEvent e) {
        if (onDrag) {
            int x = e.getX();
            int y = e.getY();

            Canvas comp = (Canvas) e.getSource();
            Graphics g = comp.getGraphics();
                            // comp.repaint(); << for cleaning up the intermediate lines : doesnt work :(
            g.drawLine(sx, sy, x, y);
            return;
        }
        onDrag = true;
        sx = e.getX();
        sy = e.getY();

        System.out.println("Draggg");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("Pressed");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("Released");
        if (onDrag)
            onDrag = false;
    }
}

public class Can extends Canvas {
    @Override
    public void paint(Graphics g) {

    }
}
}

問題: 1)ウィンドウを最小化して復元すると、描画された線が消えます(再描画のため) 2)線がマウスに追従する必要があります(ドラッグされたとき)。最後の行は、マウスを押した時点から離した時点まで延長する必要があります。Rite では、マウスが動くと新しい線が描かれます。canvas から中間行をクリーンアップする方法がわかりません。

誰かがこれらの問題について私を助けることができますか?

4

3 に答える 3

13

このような「描画」の簡単な例を次に示します。

public static void main ( String[] args )
{
    JFrame paint = new JFrame ();

    paint.add ( new JComponent ()
    {
        private List<Shape> shapes = new ArrayList<Shape> ();
        private Shape currentShape = null;

        {
        MouseAdapter mouseAdapter = new MouseAdapter ()
        {
            public void mousePressed ( MouseEvent e )
            {
            currentShape = new Line2D.Double ( e.getPoint (), e.getPoint () );
            shapes.add ( currentShape );
            repaint ();
            }

            public void mouseDragged ( MouseEvent e )
            {
            Line2D shape = ( Line2D ) currentShape;
            shape.setLine ( shape.getP1 (), e.getPoint () );
            repaint ();
            }

            public void mouseReleased ( MouseEvent e )
            {
            currentShape = null;
            repaint ();
            }
        };
        addMouseListener ( mouseAdapter );
        addMouseMotionListener ( mouseAdapter );
        }

        protected void paintComponent ( Graphics g )
        {
        Graphics2D g2d = ( Graphics2D ) g;
        g2d.setPaint ( Color.BLACK );
        for ( Shape shape : shapes )
        {
            g2d.draw ( shape );
        }
        }
    } );

    paint.setSize ( 500, 500 );
    paint.setLocationRelativeTo ( null );
    paint.setVisible ( true );
}

描画されたすべての形状を記憶し、少しの努力でそれを拡張して、好きな他の形状を描くことができます。

于 2012-04-11T08:36:29.043 に答える
6

AWTパッケージの Line2D オブジェクトを利用して、次の手順を実行します。

  1. 1 回目と 2 回目のクリックのマウス(X、Y)値を作成する
  2. boolean variableクリックが 1 回目か 2 回目かを確認する を作成します
  3. オブジェクトを格納するListコンテナを作成しますLine2D
  4. Canそれらをオブジェクトに描画します
  5. マウス リスナーのイベントを通じて前後(X,Y)値 割り当てます。

ステップ番号5は、次の方法で実現できます。

  1. e.getX()
  2. e.getY()

ここで、e はマウス イベントであり、マウス リスナー メソッドのパラメーターを介してアクセスできます。

于 2012-04-11T08:10:02.467 に答える
2

awt パッケージの Line2D オブジェクトを使用し、最初のクリックと 2 番目のクリックの x 値と y 値を作成し、最初のクリックか 2 番目のクリックかを決定するブール値を作成する必要があります。次に、Line2D の ArrayList を作成し、それらを Can オブジェクトに描画します。そのため、MouseEvent.getX() と getY() を使用して、マウス リスナーのイベントに前後の x 値と y 値を割り当てることができます。

于 2012-04-11T07:42:20.387 に答える