javaswingmousemotionlistener

Java Swing moving shapes with mouse


I am working on a simple object drawing program using Swing in Java. My program simply should draw shapes according to buttons when clicked, and move any shapes with the mouse. I have four buttons which draw rectangle, circle and square on screen. So far I did managed to draw to shapes when you click on buttons. but i want to move the shapes on screen which it did not work out.

The problem is this: When I click on circle shape to drag it around with mouse, it clears all the screen and noting is on the screen.

And, is there a way to clean all the screen when I click on clear button?

Thank you?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class PaintProject extends JComponent implements ActionListener, 
    MouseMotionListener {

    private  int CircleX=0;
    private  int CircleY=0;
    private  int RectX=100;
    private  int RectY=100;
    private  int SquareX=300;
    private  int SquareY=200;


    public static void main(String[] args) {
        JFrame frame = new JFrame("NEW PAINT PROGRAME!");

        JButton CircleButton = new JButton("Circle");
        CircleButton.setActionCommand("Circle");

        JButton RectangleButton = new JButton("Rectangle");
        RectangleButton.setActionCommand("Rectangle");

        JButton SquareButton = new JButton("Square");
        SquareButton.setActionCommand("Square");

        PaintProject paint = new PaintProject();

        CircleButton.addActionListener(paint);
        RectangleButton.addActionListener(paint);
        SquareButton.addActionListener(paint);


        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        frame.add(paint);
        frame.add(CircleButton);
        frame.add(RectangleButton);
        frame.add(SquareButton);


        frame.addMouseMotionListener(paint);

        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(500, 500);

    }

    private void drawCircle() {
        Graphics g = this.getGraphics();
        g.setColor(Color.red);
        g.fillOval(CircleX, CircleY, 100, 100);
    }

    private void drawRectangle() {
        Graphics g = this.getGraphics();
        g.setColor(Color.green);
        g.fillRect(RectX, RectY, 100, 300);
    }
    private void drawSquare() {
        Graphics g = this.getGraphics();
        g.setColor(Color.blue);
        g.fillRect(SquareX, SquareY, 100, 100);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        if (command.equals("Circle")) {
        drawCircle();
    }
    else if (command.equals("Rectangle")) {
        drawRectangle();
    }
    else if (command.equals("Square")) {
        drawSquare();
    }

    }

    @Override
    public void mouseDragged(MouseEvent e) {
        CircleX=e.getX();
        CircleY=e.getY();
        repaint();
    }

}

Solution

  • As noted here and here, getGraphics() is not how to perform custom painting in Swing. Instead, override paintComponent() to render the desired content. It looks like you want to drag shapes using the mouse. A basic approach to moving a selected object is shown here; substitute your fillXxx() invocation for the drawString() shown there. For multiple shapes, use a List<Shape>; the clear command then becomes simply List::clear. A complete example is cited here; it features moveable, selectable, resizable, colored nodes connected by edges.

    image