fusi0n
fusi0n

Reputation: 1079

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

}

Upvotes: 1

Views: 505

Answers (3)

Aurelien Ribon
Aurelien Ribon

Reputation: 7634

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

Upvotes: 1

Durandal
Durandal

Reputation: 20059

You are resetting your points array every time you painted it (preFillPoints() is called in paint()). Your pointsArray (which should be called pointsList for gods sake) is completely meaninless, you add the same points[] array each time the mouse is released.

The code makes no sense. You only need the list or the array. Not both. Declare a List<Point> (not Point[]) and just add a new Point every time the mouse moves.

Upvotes: 1

Reji
Reji

Reputation: 3516

private ArrayList<Point[]> pointsArray = new ArrayList<>();

This is a list of Point[]. Here only one private Point points[] = new Point[10000]; is allocated. Which means that each time you add points into pointArray, you are adding the same instance of points.

When you change the elements of points, all the existing Point[] in pointArray is updated. Since all the elements are referring to the same points.

Allocate new Point[] when drawing a new line.

Upvotes: 1

Related Questions