4

私は次のことを達成しようとしています

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

これはうまく機能しますが、上のスクリーンショットのように外側がまだ暗くなっている間に、長方形内の領域を完全に透明にしたいと思います。

何か案は?

4

2 に答える 2

5

..上のスクリーンショットのように、外側がまだ暗くなっている間、長方形内の領域を完全に透明にします。

  • ペイントするコンポーネントのサイズであるRectangle( )を作成します。componentRect
  • その形状()のArea( )を作成します。componentAreanew Area(componentRect)
  • Areaの(selectionArea)を作成しますselectionRectangle
  • を呼び出しcomponentArea.subtract(selectionArea)て、選択したパーツを削除します。
  • 電話Graphics.setClip(componentArea)
  • 半透明の色をペイントします。
  • (さらにペイント操作が必要な場合は、クリッピング領域をクリアします)。
于 2012-08-26T04:16:38.703 に答える
5

アンドリューが提案したように(私が私の例を終えている間、ちょうど私を打ち負かしました)

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

表示と非表示

于 2012-08-26T04:21:06.113 に答える