Внутренне-прозрачное окно выбора в Java с использованием GlassPane
Я пытаюсь добиться следующего
http://www.qksnap.com/i/3hunq/4ld0v/screenshot.png
В настоящее время я могу успешно рисовать прямоугольники на полупрозрачном фоне стеклянной панели, используя следующий код:
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g.setColor(Color.black); // black background
g.fillRect(0, 0, frame.getWidth(), frame.getHeight());
g2.setColor(Color.GREEN.darker());
if (getRect() != null && isDrawing()) {
g2.draw(getRect()); // draw our rectangle (simple Rectangle class)
}
g2.dispose();
}
Это прекрасно работает, однако, я хотел бы, чтобы область внутри прямоугольника была полностью прозрачной, в то время как внешняя сторона была еще темнее, как на скриншоте выше.
Есть идеи?
2 ответа
Решение
... область внутри прямоугольника должна быть полностью прозрачной, в то время как внешняя сторона была еще темнее, как на скриншоте выше.
- Создать
Rectangle
(componentRect
) это размер окрашиваемого компонента. - Создать
Area
(componentArea
) этой формы (new Area(componentRect)
). - Создать
Area
(selectionArea
) изselectionRectangle
, - Вызов
componentArea.subtract(selectionArea)
удалить выбранную часть. - Вызов
Graphics.setClip(componentArea)
- Краска полупрозрачного цвета.
- (Очистите область отсечения, если требуется больше операций рисования).
Как предложил Эндрю (просто побей меня, пока я заканчиваю свой пример)
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
g.setColor(Color.black); // black background
Area area = new Area();
// This is the area that will filled...
area.add(new Area(new Rectangle2D.Float(0, 0, getWidth(), getHeight())));
g2.setColor(Color.GREEN.darker());
int width = getWidth() - 1;
int height = getHeight() - 1;
int openWidth = 200;
int openHeight = 200;
int x = (width - openWidth) / 2;
int y = (height - openHeight) / 2;
// This is the area that will be uneffected
area.subtract(new Area(new Rectangle2D.Float(x, y, openWidth, openHeight)));
// Set up a AlphaComposite
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2.fill(area);
g2.dispose();
}