Java Graphics,使用click事件更改图形的颜色

use*_*349 1 java graphics swing colors mouseclick-event

好吧基本上我正在尝试编写一个GUI应用程序,在其主窗口中绘制2个圆圈和2个矩形.我试图得到它,以便每当用户在圆圈或矩形内点击时,该特定圆或矩形变为另一种随机颜色.

目前我已经得到它,以便MouseClick事件(屏幕上的任何地方)导致所有的圆形或矩形将颜色改变为相同的颜色.这是我到目前为止所得到的:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Question2 {
    public static void main(String[] args) {
        SecondFrame f = new SecondFrame("Draw and Fill");
        f.init();
    }
}   

class SecondFrame extends JFrame{
    SecondFrame(String title) {
        super(title);
    }   

    private JPanel mainPanel;
    private GridBagConstraints gbc = new GridBagConstraints();
    private GridBagLayout gbLayout = new GridBagLayout();

    void init() {
        mainPanel = new JPanel();
        mainPanel.setLayout(gbLayout);
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setContentPane(mainPanel);
        gbc.gridheight = 1;

        mainPanel.addMouseListener(new MouseListener(){

            @Override
            public void mouseClicked(MouseEvent e) {
                Point mousePosition;
                mousePosition = mainPanel.getMousePosition();
                repaint();
            }

            @Override
            public void mouseEntered(MouseEvent e) {

            }

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

            }

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

            }

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

            }

        });

        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public void paint(Graphics g){
     super.paint(g);
     Random ran = new Random();
     // Assumes max and min are non-negative.
     int red = 0 + ran.nextInt(255 - 0 + 1);
     int green = 0 + ran.nextInt(255 - 0 + 1);
     int blue = 0 + ran.nextInt(255 - 0 + 1);

     Color myColor = new Color(red,green,blue);
     g.setColor(myColor);
     g.fillOval(50,50,200,200);
     g.fillOval(50, 255, 200, 200);
     g.fillRect(255,50,200,200);
     g.fillRect(255, 255, 200, 200);
    }

}
Run Code Online (Sandbox Code Playgroud)

如果你能指出我正确的方向,将非常感激.谢谢.

ten*_*ica 5

你会跟踪绘制的对象.然后检查是否在任何这些对象中发生了单击.如果是,请更改其颜色.例如,您可以使用Shape来表示简单表单.其contains()方法可用于确定点击点是否在形状边界内.下面是引入了一个示例ShapeItem,其具有两个属性ShapeColor.并且,一个使用列表ShapeItem绘制实际形状的面板.

还要考虑一些小的旁注:

  • 不要直接在顶层容器上涂漆,如JFrame.相反,使用JPanel或扩展JComponent;
  • 对于绘画覆盖paintComponent()而不是paint(),不要忘记打电话super.paintComponent(g);
  • 除非添加新功能,否则通常无需扩展JFrame;

看看表演风俗画教程,并仔细查看油漆机制特别是部分获取更多细节.

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

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

public class DemoShapes {
    public static final Color DEFAULT_COLOR = Color.BLUE;

    public DemoShapes() {
        List<ShapeItem> shapes = new ArrayList<ShapeItem>();
        shapes.add(new ShapeItem(new Rectangle2D.Double(110, 1, 100, 100),
                DEFAULT_COLOR));
        shapes.add(new ShapeItem(new Rectangle2D.Double(110, 110, 100, 100),
                DEFAULT_COLOR));
        shapes.add(new ShapeItem(new Ellipse2D.Double(1, 1, 100, 100),
                DEFAULT_COLOR));
        shapes.add(new ShapeItem(new Ellipse2D.Double(1, 110, 100, 100),
                DEFAULT_COLOR));

        JFrame frame = new JFrame("Shapes");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ShapesPanel panel = new ShapesPanel(shapes);
        frame.add(panel);

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

    class ShapeItem {
        private Shape shape;
        private Color color;

        public ShapeItem(Shape shape, Color color) {
            super();
            this.shape = shape;
            this.color = color;
        }

        public Shape getShape() {
            return shape;
        }

        public void setShape(Shape shape) {
            this.shape = shape;
        }

        public Color getColor() {
            return color;
        }

        public void setColor(Color color) {
            this.color = color;
        }
    }

    class ShapesPanel extends JPanel {
        private List<ShapeItem> shapes;
        private Random rand = new Random();

        public ShapesPanel(List<ShapeItem> shapesList) {
            this.shapes = shapesList;

            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {

                    Color color = getRandomColor();
                    for (ShapeItem item : shapes) {
                        if (item.getShape().contains(e.getPoint())) {
                            item.setColor(color);
                        }
                    }
                    repaint();
                }
            });
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2 = (Graphics2D) g.create();

            for (ShapeItem item : shapes) {
                g2.setColor(item.getColor());
                g2.fill(item.getShape());
            }

            g2.dispose();
        }

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

        private Color getRandomColor() {
            return new Color(rand.nextFloat(), rand.nextFloat(),
                rand.nextFloat());
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new DemoShapes();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述