Сначала вам нужно связать точку с цветом, и это можно сделать одним из двух способов:
- Рисуя точку на BufferedImage и рисуя это изображение в методе рисования компонента (paintComponent из JPanel), или
- Рисование всех точек и связанных с ними цветов в методе paintComponent путем прямой привязки цвета к точке, например, к карте или к пользовательскому объекту, который объединяет эти две точки.
В своем слушателе создайте свою точку и ее цвет и свяжите их, используя любую технику, какую пожелаете.
Например, используя HashMap<Shape, Color>
, который связывает Shape (здесь Ellipse2D, который содержит круг) и Color, называемый shapeColorMap
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.*;
@SuppressWarnings("serial")
public class RandomDot extends JPanel {
// size of JPanel
private static final int PREF_W = 800;
private static final int PREF_H = 650;
// width of dot
public static final int DOT_WIDTH = 40;
private Map<Shape, Color> shapeColorMap = new HashMap<>();
public RandomDot() {
setPreferredSize(new Dimension(PREF_W, PREF_H));
addMouseListener(new MyMouse());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// smooth out jaggies in graphics
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// iterate through the Map getting color and circle
for (Entry<Shape, Color> entry : shapeColorMap.entrySet()) {
Color color = entry.getValue();
Shape shape = entry.getKey();
g2.setColor(color);
g2.fill(shape);
}
}
private class MyMouse extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
// get a random color using HSB
float multiplier = 0.3f;
float hue = (float)Math.random();
float saturation = (float) (multiplier * Math.random() + (1 - multiplier));
float brightness = (float) (multiplier * Math.random() + (1 - multiplier));
Color color = Color.getHSBColor(hue, saturation, brightness);
// create a circle at mouse click
double x = e.getX() - DOT_WIDTH / 2;
double y = e.getY() - DOT_WIDTH / 2;
double w = DOT_WIDTH;
Ellipse2D circle = new Ellipse2D.Double(x, y, w, w);
// put both into the map
shapeColorMap.put(circle, color);
// repaint
repaint();
}
}
private static void createAndShowGui() {
RandomDot mainPanel = new RandomDot();
JFrame frame = new JFrame("RandomDot");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}