Josh
Josh

Reputation: 778

Creating "paint" application in Java

I have an array list that keeps track of the "dots" and am using an array to keep track of the different sizes. The size is changed via a mouseWheelListener and the change is saved in that array. However for some reason ALL of the dots are resized which is not what I want. After running through it a few times everything looks like it should work but I must be missing something simple. My code as follows.

//********************************************************************
//  DotsPanel.java           
//  Represents the primary panel for the Dots program.
//********************************************************************

import java.util.ArrayList;

import javax.swing.JPanel;

import java.awt.*;
import java.awt.event.*;

public class DotsPanel extends JPanel
{
    private int SIZE = 10;  // radius of each dot
    private int[] dotSizes = new int[10000];
    int i = 0;

    private ArrayList<Point> pointList;

    //-----------------------------------------------------------------
    //  Constructor: Sets up this panel to listen for mouse events.
    //-----------------------------------------------------------------
    public DotsPanel()
    {
        pointList = new ArrayList<Point>();

        addMouseListener (new DotsListener());
        addMouseMotionListener(new DotsListener());
        addMouseWheelListener(new DotsListener());

        setBackground(Color.red);
        setPreferredSize(new Dimension(300, 200));
    }

    //-----------------------------------------------------------------
    //  Draws all of the dots stored in the list.
    //-----------------------------------------------------------------
    public void paintComponent(Graphics page)
    {
        super.paintComponent(page);

        page.setColor(Color.cyan);

        for (Point spot : pointList)
            //change size to sizes[n]
            page.fillOval(spot.x-dotSizes[pointList.size()-1], spot.y-dotSizes[pointList.size()-1], dotSizes[pointList.size()-1]*2, dotSizes[pointList.size()-1]*2);

        page.drawString("Count: " + pointList.size(), 5, 15);
    }

    //*****************************************************************
    //  Represents the listener for mouse events.
    //*****************************************************************
    private class DotsListener implements MouseListener, MouseMotionListener, MouseWheelListener
    {
        //--------------------------------------------------------------
        //  Adds the current point to the list of points and redraws
        //  the panel whenever the mouse button is pressed.
        //--------------------------------------------------------------
        public void mousePressed(MouseEvent event)
        {
            pointList.add(event.getPoint());
            repaint();
        }

        //--------------------------------------------------------------
        //  Provide empty definitions for unused event methods.
        //--------------------------------------------------------------
        public void mouseClicked(MouseEvent event) {}
        public void mouseReleased(MouseEvent event) {}
        public void mouseEntered(MouseEvent event) {}
        public void mouseExited(MouseEvent event) {}

        @Override
        public void mouseDragged(MouseEvent event) 
        {
            pointList.add(event.getPoint());
            dotSizes[pointList.size()-1] = SIZE;
            //store size of dot here
            repaint();

        }

        @Override
        public void mouseMoved(MouseEvent event) {}

        @Override
        public void mouseWheelMoved(MouseWheelEvent event) 
        {
            SIZE -= event.getWheelRotation();
            repaint();
        }
    }
}

Upvotes: 0

Views: 129

Answers (2)

Kai Arakawa
Kai Arakawa

Reputation: 193

   for (Point spot : pointList)
        //change size to sizes[n]
        page.fillOval(spot.x-dotSizes[pointList.size()-1], spot.y-dotSizes[pointList.size()-1], dotSizes[pointList.size()-1]*2, dotSizes[pointList.size()-1]*2);

Here is your problem. You aren't changing the size to size[n] but you are changing the size of every one to size[pointList.size()-1] or in other words, the last one. You will probably have to use a regular for loop unless you want to find the index of the current point.

Upvotes: 0

Ted Hopp
Ted Hopp

Reputation: 234857

In this code:

for (Point spot : pointList)
    //change size to sizes[n]
    page.fillOval(spot.x-dotSizes[pointList.size()-1], spot.y-dotSizes[pointList.size()-1], dotSizes[pointList.size()-1]*2, dotSizes[pointList.size()-1]*2);

you are using a single dot size for all the dots: the size of the last dot that was added. (There's even a comment there to fix the problem!) You need to iterate with an index so you can index into the dotSizes array as well as the pointList ArrayList:

for (int i = 0; i < pointList.size(); ++i) {
    Point spot = pointList.get(i);
    int size = dotSizes[i];
    page.fillOval(spot.x-size, spot.y-size, size*2, size*2);
}

It would be much better to define your own "point with size" class that encapsulates a Point and a size:

class Spot extends Point {
    public int size;
    public Spot(int x, int y, int size) {
        super(x, y);
        this.size = size;
    }
}

Then change your pointList to an ArrayList<Spot> and you can go back to iterating over a single list:

for (Spot spot : pointList)
    page.fillOval(spot.x-spot.size, spot.y-spot.size, 2*dot.size, 2*dot.size);

Of course, you'll also have to update the code that adds points to the list accordingly.

As an aside, it seems to me that your mousePressed handler has a bug: it does not add a size when it adds a point. Switching to a Spot class would also help avoid that kind of problem.

Upvotes: 6

Related Questions