Question

I am trying to achieve the following

http://www.qksnap.com/i/3hunq/4ld0v/screenshot.png

I am currently able to draw rectangles successfully on a semi-transparent glasspane background using the following code:

    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();
}

Which works great, however, I would love to have the area within the rectangle be completely transparent while the outside was still darken much like the screenshot above.

Any ideas?

Was it helpful?

Solution

..have the area within the rectangle be completely transparent while the outside was still darken much like the screenshot above.

  • Create a Rectangle (componentRect) that is the size of the component being painted.
  • Create an Area (componentArea) of that shape (new Area(componentRect)).
  • Create an Area (selectionArea) of the selectionRectangle.
  • Call componentArea.subtract(selectionArea) to remove the selected part.
  • Call Graphics.setClip(componentArea)
  • Paint the semi-transparent color.
  • (Clear the clipping area if more paint operations are required).

OTHER TIPS

As Andrew has suggested (just beat me while I was finishing off my example)

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();
}

Show and Hide

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top