В основном то, что я хочу сделать, это сделать курсор для JComponent, пиксели которого отображаются как инверсия цвета, над которым они находятся. Например, возьмите мышь и наведите ее на буквы в адресе этой страницы. Если присмотреться, то пиксели курсора, находящиеся над черными пикселями буквы, становятся белыми. Я знаю, что вы можете инвертировать цвет RGB, вычитая текущие красный, зеленый и синий цвета из 255 для каждого соответствующего поля, но я не знаю, как реализовать это так, как я хочу.
Это часть базовой программы рисования, которую я делаю. JComponent, о котором я упоминал ранее, — это мой «холст», на котором вы можете рисовать с помощью различных инструментов. Я НЕ использую java.awt.Cursor для изменения своего курсора, потому что я хочу, чтобы курсор динамически менялся в зависимости от того, что находится под ним. «Курсор», который я использую, определяется как изображение .png, и я создаю BufferedImage из этого файла, который затем могу рисовать поверх существующего BufferedImage всего компонента. Я перерисовываю это изображение, используя точку, определенную MouseListener.
Я заглянул в AlphaComposite, и он выглядит близко к тому, что я хочу, но нет ничего об инвертировании цветов под курсором, как я хочу. Пожалуйста помоги.
РЕДАКТИРОВАТЬ:
Так что мне просто пришлось сделать это сложным путем с помощью алгоритма, потому что для этой цели не было ничего встроенного. Вот код немного вырванный из контекста:
/**
* Changes the color of each pixel under the cursor shape in the image
* to the complimentary color of that pixel.
*
* @param points an array of points relative to the cursor image that
* represents each black pixel of the cursor image
* @param cP the point relative to the cursor image that is used
* as the hotSpot of the cursor
*/
public void drawCursorByPixel(ArrayList<Point> points, Point cP) {
Point mL = handler.getMouseLocation();
if (mL != null) {
for (Point p : points) {
int x = mL.x + p.x - cP.x;
int y = mL.y + p.y - cP.y;
if (x >= 0 && x < image.getWidth() && y >= 0 && y < image.getHeight()) {
image.setRGB(x, y, getCompliment(image.getRGB(x, y)));
}
}
}
}
public int getCompliment(int c) {
Color col = new Color(c);
int newR = 255 - col.getRed();
int newG = 255 - col.getGreen();
int newB = 255 - col.getBlue();
return new Color(newR, newG, newB).getRGB();
}