• category: swing folder: SoftClippedWindow title: Windowの縁をソフトクリッピングでなめらかにする tags: [JWindow, AlphaComposite] author: aterai pubdate: 2019-03-04T15:46:57+09:00 description: Windowの形を図形で切り抜きした場合に生じる縁のジャギーをソフトクリッピング効果でなめらかに変更します。 image: https://drive.google.com/uc?id=1qfCcXJGR0gXwMZu9LI_5jSJ_rPNct5o4rg

概要

Windowの形を図形で切り抜きした場合に生じる縁のジャギーをソフトクリッピング効果でなめらかに変更します。

サンプルコード

JWindow window = new JWindow();
window.setBackground(new Color(0x0, true));
window.getContentPane().add(makePanel(clippedImage));
window.pack();
window.setLocationRelativeTo(((AbstractButton) e.getSource()).getRootPane());
window.setVisible(true);
// ...
private static BufferedImage makeClippedImage(BufferedImage source, Shape shape) {
  int width = source.getWidth();
  int height = source.getHeight();

  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
  Graphics2D g2 = image.createGraphics();
  // g2.setComposite(AlphaComposite.Clear);
  // g2.fillRect(0, 0, width, height);

  g2.setComposite(AlphaComposite.Src);
  g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  // g2.setColor(Color.WHITE);
  g2.fill(shape);

  g2.setComposite(AlphaComposite.SrcAtop);
  g2.drawImage(source, 0, 0, null);
  g2.dispose();

  return image;
}
View in GitHub: Java, Kotlin

解説

  • clipped window
  • soft clipped window
    • JWindowの背景色を完全に透明(new Color(0x0, true)でアルファ値が0)に設定
    • Window#setShape(Shape)メソッドは使用せず、代わりにJWindowCcontentPaneに図形(切り抜き用のラウンド矩形)と画像をソフトクリッピング効果(AlphaComposite.SrcAtop)でブレンド処理して描画するJPanelを追加
    • softclippedwindow.java
    • 参考: Java Developer Connection

参考リンク

コメント