簡體   English   中英

在JPanel上繪制多行時出錯

[英]Error with drawing multiple lines on JPanel

我正在嘗試在JPanel上繪制多行。 我的代碼將每一行添加到ArrayList ,然后for循環應該遍歷它以繪制每一行。 但我得到了這個奇怪的輸出。

這是我的代碼:

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]

我認為線條消失的原因未在此代碼中顯示。 這是我如何更新它。

   @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);
    }  
}

這將在兩個點之間繪制一條線,並且在釋放鼠標之前不會存儲該線。 如果您確實希望它像鉛筆一樣繪制,也可以在鼠標拖動方法中添加新行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM