1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| import java.awt.AWTException;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Robot;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
public class ColorCursorMouseAdapter extends MouseAdapter {
private static final String PREFIX = "COLORPICKERCURSOR_";
private static Map<Color,Cursor> cursors = new HashMap<>();
private Cursor componentCursor;
private JComponent lastcomponent;
@Override
public void mouseMoved(MouseEvent e) {
JComponent component = (JComponent) e.getSource();
if ( lastcomponent!=component ) {
restoreCursor(lastcomponent);
}
lastcomponent = component;
Rectangle bounds = component.getBounds();
Point point = bounds.getLocation();
SwingUtilities.convertPointToScreen(point, component);
bounds.setLocation(point);
try {
Robot robot = new Robot();
BufferedImage image = robot.createScreenCapture(bounds);
Color color = new Color(image.getRGB(e.getX(), e.getY()));
saveCursor(component);
component.setCursor(getCursor(color));
} catch (AWTException exception) {
exception.printStackTrace();
}
}
@Override
public void mouseExited(MouseEvent e) {
restoreCursor((Component)e.getSource());
lastcomponent=null;
componentCursor=null;
}
@Override
public void mouseDragged(MouseEvent e) {
restoreCursor((Component)e.getSource());
}
private void restoreCursor(Component source) {
if ( lastcomponent==source && componentCursor!=null ) {
lastcomponent.setCursor(componentCursor);
}
}
private void saveCursor(Component component) {
Cursor cursor = component.getCursor();
if ( !cursor.getName().startsWith(PREFIX) ) {
componentCursor = cursor;
}
}
private Cursor getCursor(Color color) {
return cursors.computeIfAbsent(color, this::createCursor);
}
private Cursor createCursor(Color color) {
BufferedImage bufferedImage = new BufferedImage(32,32,BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = bufferedImage.createGraphics();
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics.setColor(color);
graphics.fillOval(10, 10, 13, 13);
graphics.setColor(Color.BLACK);
graphics.drawOval(10, 10, 13, 13);
graphics.drawOval(10, 10, 12, 12);
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR));
graphics.drawLine(13, 16, 19, 16);
graphics.drawLine(16, 13, 16, 19);
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
graphics.drawLine(13, 16, 19, 16);
graphics.drawLine(16, 13, 16, 19);
graphics.dispose();
return java.awt.Toolkit.getDefaultToolkit().createCustomCursor(bufferedImage, new Point(25,25), PREFIX+color.toString());
}
} |
Partager