2009-06-13 6 views
6

Javaでソフトボーダーの非長方形のウィンドウを作成するにはどうすればよいですか?
ソフトボーダー(ソフトクリッピングとも呼ばれます)は、エイリアシングアーチファクトのない境界です。スイング:柔らかい罫線で非長方形のウィンドウを作成する方法?

私はウェブをたくさん検索し、半透明であるか、または 非長方形のウィンドウについてのいくつかの記事を見つけました。

トピック「ソフトボーダー」は混乱します。私が発見した情報は、内のソフトバンクを他のJavaコンポーネントに適用してお得になったようです。

カスタムシェイプのJWindowにソフトボーダーを適用することはできますか?

私はprimelyポスト以下を参照しています:それはソフトクリッピングになると記事転送が
http://weblogs.java.net/blog/campbell/archive/2006/07/java_2d_tricker.html
に、
http://today.java.net/pub/a/today/2008/03/18/translucent-and-shaped-swing-windows.html

しかし、ここでは、既存のGraphics2Dオブジェクト上のソフトクリッピングが記載されています。

答えて

0

は、あなたがこの記事を読んだ:

http://www.pushing-pixels.org/?p=272

それはソフトクリッピング、あなたが言及した以前の記事に言及するだけでなく、ソフトクリッピングウィンドウを実装するためにいくつかのソースコードが含まれ、直接リンクはこちら:

http://www.pushing-pixels.org/wp-content/uploads/2008/03/softclippedwindow.java

これは、実行したいことに対して可能な解決策を提供するはずです。

+0

申し訳ありませんが、私が探しているものではありません。 上記の例では、別のSwingウィンドウ内に**ソフトクリップウィンドウ**を表示しています。単純な解決策はないようです。私はデスクトップをキャプチャしてその意図を達成でき、ソフトクリッピングをシミュレートするためにそのデータを含めることができると思います...あまりにも複雑です! ;) –

+0

いいえ、そうではありません。どちらのウィンドウもトップレベルのウィンドウです。 SoftClippedWindowの例を実行し、元のウィンドウを移動してみてください。コードは一度に多すぎるものを表示しようとしていますが、リフレクションコードをトリミングすると、ソフトクリッピングされたトップレベルウィンドウを得ることができます。 –

-1
import java.awt.*; 

public class First extends Applet 
    { 
    public void paint(Graphics g) 
      { 
      g.drawRect(100,50,500,800); 
      } 
    } 
/*<Applet code="First.class"height=500 width=500> 
    </Applet> 
*/ 
3

ここでは、ソフトクリッピングされた、シェイプされたトップレベルのウィンドウについて取り上げます。注意:シェイプされたウィンドウは独自のAPI(com.sun.awt.AWTUtilities)を使用しており、Sun以外のJVMでの動作は保証されていません。ただし、JDK 7ではWindowクラスの一部になります。

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class MySoftClippedWindow extends JPanel  { 
    public MySoftClippedWindow()   { 
     super(); 
     setLayout(new GridBagLayout()); 
     JButton button = new JButton(new AbstractAction("Close") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 
      } 
     }); 
     button.setOpaque(false); 
     add(button); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g.create(); 

     int width = getWidth(); 
     int height = getHeight(); 

     // Create a soft clipped image for the background 
     BufferedImage img = java_2d_tricker(g2d, width, height); 
     g2d.drawImage(img, 0, 0, null); 

     g2d.dispose(); 
    } 

    public static void main(String[] args) { 
     JFrame.setDefaultLookAndFeelDecorated(true); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final JWindow w = new JWindow(); 
       Container cp = w.getContentPane(); 
       cp.setLayout(new BorderLayout()); 
       cp.add(new MySoftClippedWindow()); 
       w.setAlwaysOnTop(true); 
       com.sun.awt.AWTUtilities.setWindowOpaque (w, false); 
       w.setSize(200, 200); 
       w.setVisible(true); 
      } 
     }); 
    } 

    /* 
    * This code is taken from 
    * http://weblogs.java.net/blog/campbell/archive/2006/07/java_2d_tricker.html 
    */ 
    private BufferedImage java_2d_tricker(Graphics2D g2d, int width, int height) { 
     GraphicsConfiguration gc = g2d.getDeviceConfiguration(); 
     BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT); 
     Graphics2D g2 = img.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.fillOval(width/4, height/4, width/2, height/2); 
     g2.setComposite(AlphaComposite.SrcAtop); 
     g2.setPaint(new GradientPaint(0, 0, Color.RED, 0, height, Color.YELLOW)); 
     g2.fillRect(0, 0, width, height); 
     g2.dispose(); 
     return img; 
    } 
} 
関連する問題