简体   繁体   中英

How to draw Paint In Swing

I am writing a program that draw line in Java, I used PaintComponent but I didn't know why it doesn't work. The below code I've wrote so far. Please help me. I created JFrame in other class.

package Paint;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;

import javax.swing.JPanel;

public class MousePanel extends JPanel {
    private boolean start;
    private Point last;
    private ArrayList<Point> lines;

    public MousePanel() {
        start = false;
        lines = new ArrayList<Point>();
        addMouseListener(new MouseHandler());
        addMouseMotionListener(new MouseMotionHandler());
        setBackground(Color.white);
    }

    private class MouseHandler extends MouseAdapter {
        public void mouseClicked(MouseEvent e) {
            if (e.getButton() == e.BUTTON1) {
                start = true;
                last = new Point(e.getX(), e.getY());
                lines.add(last);
            }
            if (e.getButton() == e.BUTTON3)
                start = false;
        }
    }

    private class MouseMotionHandler extends MouseMotionAdapter {
        public void mouseMoved(MouseEvent e) {
            if (start) {
                last = new Point(e.getX(), e.getY());
                lines.add(last);
                repaint();
            }
        }
    }
    public void paintComponent(Graphics g){
           super.paintComponent(g);
           g.setColor(Color.black);
           // draw all lines
           if (lines.size()<2) return;
           Point firstPoint = (Point)lines.get(0);
           Point secondPoint;
           for (int i = 1; i < lines.size(); i++){
              secondPoint = (Point) lines.get(i);
              g.drawLine(firstPoint.x, firstPoint.y,            secondPoint.x, secondPoint.y);
              firstPoint = secondPoint;
            }
        }

}

You need to use mousePressed and mouseDragged instead of mouseClicked and mouseMoved . I have re-factored your code. Hope it helps.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

import javax.swing.JPanel;

public class MousePanel extends JPanel {

    private boolean start;
    private Point last;
    private ArrayList<Point> lines;

    public MousePanel() {
        start = false;
        lines = new ArrayList<Point>();
        MouseHandler mouseHandler = new MouseHandler();
        addMouseListener(mouseHandler);
        addMouseMotionListener(mouseHandler);
        setBackground(Color.white);
    }

    private class MouseHandler extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1) {
                start = true;
                last = new Point(e.getX(), e.getY());
                lines.add(last);
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            if (e.getButton() == MouseEvent.BUTTON1) {
                start = false;
            }
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (start) {
                last = new Point(e.getX(), e.getY());
                lines.add(last);
                repaint();
            }
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.black);
        // draw all lines
        if (lines.size() < 2) {
            return;
        }
        Point firstPoint = (Point) lines.get(0);
        Point secondPoint;
        for (int i = 1; i < lines.size(); i++) {
            secondPoint = (Point) lines.get(i);
            g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
            firstPoint = secondPoint;
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM