How to display the contents in an array by using mouseListener?

那年仲夏 提交于 2021-01-28 13:31:33

问题


I'm doing a program in which there are 8 shapes contained in an array that will be displayed when you click the mouse. I am new to Java and not that familiar with event handlers and listeners.

I am trying to make the shapes appear at the location the mouse is clicked at inside the frame yet I am having trouble since the constructor of each shape use 2 Points as its parameter.

Here's an example from the code:

import MyLibs.Circle;
import MyLibs.Rectangle;
import MyLibs.Shape;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

public class DrawInScreenOnClickTest extends javax.swing.JFrame {

    private Image dbImage;

    Shape[] sh = new Shape[] {
        new Circle(new Point(50, 60), new Point(130, 180)),
            new Rectangle(new Point(50, 200), new Point(150, 350)),
            new Circle(new Point(200, 300), new Point(350, 350)),
            new Rectangle(new Point(100, 100), new Point(250, 250)),
            new Circle(new Point(150, 150), new Point(300, 300)),
            new Circle(new Point(200, 200), new Point(450, 500)),
            new Rectangle(new Point(300, 300), new Point(550, 550)),
            new Circle(new Point(150, 150), new Point(320, 320))
    };

    Color[] colors = new Color[] {
        Color.cyan, Color.green, Color.red, Color.blue, Color.magenta, Color.orange
    };

    Random random = new Random();
    int i = 0;
    Shape shape;
    boolean first = true;


    public DrawInScreenOnClickTest() {
        initComponents();
    }


    private void formMouseClicked(java.awt.event.MouseEvent evt) {
        repaint();
    }


    public class Mouse extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
        }
    }

    public void paint(Graphics g) {

        if (first == true) {
            first = false;
        } else {
            int shapeColor = random.nextInt(6);

            Shape shape = sh[i]; //calls shapes array
            shape.setColor(colors[shapeColor]); //call colors array random
            shape.drawShape(g); //display shape
            if (i == 4) {
                i = 0;
            } else
                i++;
        }
    }


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new DrawInScreenOnClickTest().setVisible(true);
            }
        });
    }
}

回答1:


Here's an example that alternates drawing of shapes (rectangle and circle) with randomized lengths and widths.

This example makes use of paintComponent(...) method to draw shapes in the screen.

You shouldn't extend JFrame unless you're changing the behavior of it, instead build your UI towards the use of JPanels which are more flexible and allow you to use paintComponent.

I made use of the Shape API rather than a custom Shape class (which you're using and you didn't post the code for it).

I didn't included the randomized color as that's up to the OP to write it, this is just an example on how to draw components on mouse click.

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class DrawInScreenOnClickTest {
    private JFrame frame;
    private DrawingPane pane;
    private List<Shape> shapes;
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new DrawInScreenOnClickTest()::createAndShowGUI);
    }
    
    private void createAndShowGUI() {
        frame = new JFrame(getClass().getSimpleName());
        
        shapes = new ArrayList<Shape>();
        shapes.add(new Ellipse2D.Double(50, 50, 50, 50));
        shapes.add(new Rectangle.Double(50, 200, 50, 100));
        shapes.add(new Ellipse2D.Double(150, 200, 150, 150));
        
        pane = new DrawingPane();
        
        pane.addMouseListener(new MouseListen());
        
        frame.add(pane);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
    @SuppressWarnings("serial")
    class DrawingPane extends JPanel {
        public void addNewShape(Shape s) {
            
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;
            for (Shape s : shapes) {
                g2d.draw(s);
            }
        }
        
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(500, 500);
        }
    }

    class MouseListen extends MouseAdapter {
        int counter = 0;
        
        @Override
        public void mouseClicked(MouseEvent e) {
            super.mouseClicked(e);
            counter++;
            
            if (counter % 2 == 0) {
                shapes.add(new Rectangle.Double(e.getX(), e.getY(), Math.random() * 50, Math.random() * 50));
            } else {
                shapes.add(new Ellipse2D.Double(e.getX(), e.getY(), Math.random() * 50, Math.random() * 50));
            }
            pane.repaint();
        }
    }
}

Additional (recommended) lecture:

  • How to draw circles on click
  • How the Shapes API work
  • How to draw multiple objects in a single JPanel
  • paint() vs paintComponent()


来源:https://stackoverflow.com/questions/62762261/how-to-display-the-contents-in-an-array-by-using-mouselistener

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!