2013-02-18 73 views
13

我想讓JFrame透明,但它上面的圖像是不透明的。這是我現在有:如何製作透明的JFrame,但保持其他一切?

enter image description here

有誰知道一種方法,使只有JFrame透明?

這裏是我的代碼:

import javax.swing.*; 
import java.awt.*; 
import com.sun.awt.AWTUtilities; 
import static java.awt.GraphicsDevice.WindowTranslucency.*; 

public class SplashDemo extends JFrame 
{ 
    public SplashDemo() 
    { 
     setUndecorated(true); 
     setSize(200, 200); 

     add(new JLabel(new ImageIcon("puppy2.png"))); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setVisible(true); 

     setOpacity(0.85f);  
    } 

    public static void main(String[] args) 
    { 
     new SplashDemo(); 
    } 
} 
+1

使框架透明。允許內容窗格半透明並且內容不透明 – MadProgrammer 2013-02-18 01:03:36

回答

26

基本上,你需要做一個透明窗口,半透明的內容窗格。這添加到內容窗格將意味着什麼,將繼續無需額外alphering被渲染...

enter image description here

public class TranscluentWindow { 

    public static void main(String[] args) { 
     new TranscluentWindow(); 
    } 

    public TranscluentWindow() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        try { 
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (Exception ex) { 
        } 

        JWindow frame = new JWindow(); 
        frame.setAlwaysOnTop(true); 
        frame.addMouseListener(new MouseAdapter() { 
         @Override 
         public void mouseClicked(MouseEvent e) { 
          if (e.getClickCount() == 2) { 
           SwingUtilities.getWindowAncestor(e.getComponent()).dispose(); 
          } 
         } 
        }); 
        frame.setBackground(new Color(0,0,0,0)); 
        frame.setContentPane(new TranslucentPane()); 
        frame.add(new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/Puppy.png"))))); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
       } 

      } 
     }); 
    } 

    public class TranslucentPane extends JPanel { 

     public TranslucentPane() { 
      setOpaque(false); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.85f)); 
      g2d.setColor(getBackground()); 
      g2d.fillRect(0, 0, getWidth(), getHeight()); 

     } 

    } 

} 
+1

非常感謝您的幫助。那是很多工作嗎?你好像花了很多時間做OO的研究。 – r1nzler 2013-02-18 01:39:33

+3

不是 - 一直做這種東西;) – MadProgrammer 2013-02-18 01:40:46

+2

+1,很酷。 JDK7沒有玩過多少。我沒有意識到讓頂級窗口透明是很容易的。它看起來像所有你需要做的是使用一個trasparent背景顏色。 – camickr 2013-02-18 05:22:14