Search code examples
javaswinguser-interfacejpanelpaintcomponent

Java panel interface


Im trying to make a pline drawing program. when I try to repaint all of the lines(after creating a new one) only the last one is draw out.The problem might be in repainting.

Can someone see what I am doing wrong?

Code is here:

public class Kimp extends JFrame {

private ArrayList<Point[]> pointsArray = new ArrayList<>();
private Point points[] = new Point[10000];
private int pointCounter = 0;

public Kimp () {

     panel paintArea = new panel();
     add(paintArea, BorderLayout.CENTER);
}

private class panel  extends JPanel {

    public panel () {
        HandlerClass handler = new HandlerClass();
        this.addMouseListener(handler);
        this.addMouseMotionListener(handler);
    }

    @Override
     void paintComponent(Graphics g) {
        super.paintComponent(g);
        try {


            for (Point[] p : pointsArray) {
                for(int i = 0; i < p.length; i++) {                         
                    if (p[i].x == 0) {
                       continue;
                    } else {
                        if (p[i + 1].x == 0) {
                            g.setColor(Color.BLUE);
                            g.drawLine(p[i].x, p[i].y, p[i].x, p[i].y);
                        } else {
                            g.setColor(Color.BLUE);
                            g.drawLine(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y);
                        }
                    } 
                } 
            }
            points = preFill(points);
        } catch (NullPointerException e) {

        }                  
    }
}

private class HandlerClass implements MouseListener , MouseMotionListener {

    @Override
    public void mouseDragged(MouseEvent e) {
        points[pointCounter++] = e.getPoint();
    }

    @Override
    public void mousePressed(MouseEvent e) {
        points[pointCounter] = e.getPoint();
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

}

public static Point[] preFill (Point[] points) {
    for (int i = 0; i < points.length; i++) {
        points[i] = new Point(-999,-999);
    }
    return points;
}

}


Solution

  • I quickly rewrote your code to simplify it as much as possible. You may be able to better understand the concepts behind it.

    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.Color;
    import java.awt.event.*;
    
    import java.util.*;
    import javax.swing.*;
    
    public class Kimp {
        public static void main(String[] args) {
            JFrame frame = new JFrame("Kimp!");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(800, 600);
            frame.setLocationRelativeTo(null);
            frame.add(new CanvasPanel());
            frame.setVisible(true);
        }
    }
    
    class CanvasPanel extends JPanel {
        private final List<List<Point>> lines = new LinkedList<List<Point>>();
        private List<Point> points = new LinkedList<Point>();
    
        public CanvasPanel() {
            addMouseListener(mouseAdapter);
            addMouseMotionListener(mouseAdapter);
        }
    
        @Override
        public void paintComponent(Graphics g) {
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());
    
            for (List<Point> line : lines)
                drawLine(line, g);
            drawLine(points, g);
        }
    
        private void drawLine(List<Point> points, Graphics g) {
            if (points.size() < 2) return;
    
            Point p1 = points.get(0);
    
            for (int i=1, n=points.size(); i<n; i++) {
                Point p2 = points.get(i);
    
                g.setColor(Color.BLUE);
                g.drawLine(p1.x, p1.y, p2.x, p2.y);
    
                p1 = p2;
            }
        }
    
        private MouseAdapter mouseAdapter = new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                points.add(e.getPoint());
                repaint();
            }
    
            @Override
            public void mouseDragged(MouseEvent e) {
                points.add(e.getPoint());
                repaint();
            }
    
            @Override
            public void mouseReleased(MouseEvent e) {
                if (points.size() > 1) {
                    lines.add(points);
                    points = new LinkedList<Point>();
                }
            }
        };
    }