Внутренне-прозрачное окно выбора в 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();
}

Показать и скрыть

Другие вопросы по тегам