stupidmoron
stupidmoron

Reputation: 1

Mouse Drawing Application: Nothing shows up

This is a word-for-word example straight out of the book Java How to Program by Paul and Harvey Deitel.

PaintPanel.java

// Using class MouseMotionAdapter
import java.awt.Point;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JPanel;

public class PaintPanel extends JPanel {
    private int pointCount = 0;
    // array of 10,000 java.awt.Point references
    private Point[] points = new Point[10000];
    // set up gui and register mouse event handler
    public PaintPanel() {
        addMouseMotionListener(new MouseMotionAdapter() {
            // store drag coordinates and repaint
        
            public void MouseDragged(MouseEvent e) {
                if (pointCount < points.length) {
                    points[pointCount] = e.getPoint();
                    pointCount++;
                    repaint();
                } // end if
            }
        }
        );
    }
    
    // draw ovals in a 4 x 4 bounding box at specified location on the window
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);  // clear drawing area
        g.setColor(Color.BLUE);
        // draw all points in the array
        for(int i = 0; i < pointCount; i++)
            g.fillOval(points[i].x, points[i].y, 4, 4);
    }
}

Driver program Painter.java

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Painter {
    public static void main(String[] args) {
        JFrame app = new JFrame("A Simple Paint Program");
        PaintPanel pp = new PaintPanel();
        app.add(pp, BorderLayout.CENTER);
        app.add(new JLabel("Drag the rat to draw"), BorderLayout.SOUTH);
        app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        app.setSize(400, 200);
        app.setVisible(true);
    }
}

When I run it, it shows the drawing panel but nothing happens when I try to draw on it with the mouse. All code is copied verbatim from the book. What gives?

Upvotes: 0

Views: 36

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347184

Java is case sensitive. It's mouseDragged, not MouseDragged. This is why you should always use @Override on methods you "think" you're overriding, this way you get compile time protection.

Runnable example...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new PaintPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPanel extends JPanel {
        private int pointCount = 0;
        // array of 10,000 java.awt.Point references
        private Point[] points = new Point[10000];
        // set up gui and register mouse event handler

        public PaintPanel() {
            addMouseMotionListener(new MouseMotionAdapter() {
                // store drag coordinates and repaint

                @Override
                public void mouseDragged(MouseEvent e) {
                    if (pointCount < points.length) {
                        points[pointCount] = e.getPoint();
                        pointCount++;
                        repaint();
                    } // end if
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 200);
        }

        // draw ovals in a 4 x 4 bounding box at specified location on the window
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);  // clear drawing area
            g.setColor(Color.BLUE);
            // draw all points in the array
            for (int i = 0; i < pointCount; i++) {
                g.fillOval(points[i].x, points[i].y, 4, 4);
            }
        }
    }
}

Upvotes: 1

Related Questions