Kappa Coder
Kappa Coder

Reputation: 67

Java swing. Painting program. Filling gaps?

So i have been trying to learn swing and trying to make a painting program.

The problem ive been having is that if you move your mouse to fast it doesnt fill the gaps (Run code if you dont undetstand)

Im thinking it might be where its filling up the arraylist.

So i was woundering how i can fix this, Thanks!

My code:

    import javax.swing.*;
import java.util.ArrayList;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseAdapter;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Window extends JPanel implements MouseListener{

    //new array list
    private ArrayList<Point> dots; 


static JFrame frame;
Font f;
static int Dx1=0, Dx2=0, Dy1=0, Dy2=0; //fill void dots


static int v=0;
static int posX = 250;
static int posY = 250;
static double winX=0;
static double winY=0;

public Window() {
    dots = new ArrayList<Point>();

    frame = new JFrame();
    f = new Font("Calibri", Font.BOLD, 30);

    this.setBackground(Color.white);

    frame.add(this);
    frame.setResizable(true);
    frame.setVisible(true);
    frame.setSize(500, 500);
    frame.setTitle("Minigameshuehu");

    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
      // MOVE BALL DEPENDING ON "Dragging"
    this.addMouseListener(this);

     this.addMouseListener(new MouseAdapter() {

     });
     this.addMouseMotionListener(new MouseMotionAdapter() {
         @Override
         public void mouseDragged(MouseEvent e) {

             dots.add(new Point(e.getX(), e.getY()));  // adding pos to to array to make dots
            repaint();
         }
         @Override
        public void mouseMoved(MouseEvent e) {
            posX = e.getX() - 3;
             posY = e.getY() - 3;
             repaint();
        }
     }
     );
     //End of moving ball


}

public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setColor(new Color(0,0,0));
    g2.fillOval(posX, posY, 6, 6);
}


@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setColor(Color.black);
    for (Point point : dots) {
        g2.fillOval(point.x-3, point.y-3, 6, 6);
    }
}


    public static void main(String[] args) throws InterruptedException {

        Window applikation = new Window();

    }
    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mousePressed(MouseEvent e) {
//      posX=(e.getX()-25);
//      posY=(e.getY()-25);
        // TODO Auto-generated method stub
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        v=0;
        // TODO Auto-generated method stub

    }

}

Upvotes: 0

Views: 280

Answers (1)

camickr
camickr

Reputation: 324157

if you move your mouse to fast it doesnt fill the gaps

That is correct, a MouseEvent is not generated for every pixel, so you can't just draw an oval for every point generated.

Instead, you need to draw a line between two points in your ArrayList.

for (int i = 0; i < dots.size() - 1; i++)
{
    Point p1 = dots.get(i);
    Point p2 = dots.get(i + 1);
    g2.drawLine(...);
}

You will also want to change the size of the line drawn by using something like:

g2.setStroke(new BasicStroke(15, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));

This will draw a line with a rounded edge so it looks like the end of an oval.

Upvotes: 2

Related Questions