2013-02-18 21 views
13

Chcę aby JFrame przejrzyste, ale obraz na nim być nieprzezroczysta. To jest to, co mam teraz:Jak zrobić przezroczystą ramkę JFrame, ale zachować wszystko inne tak samo?

enter image description here

Czy ktoś zna sposób, aby tylko JFrame przezroczysty?

Oto mój kod:

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

Bądź rama przejrzyste. Pozwól, aby okienko zawartości było półprzezroczyste, a zawartość będzie nieprzejrzysta. – MadProgrammer

Odpowiedz

26

Zasadniczo trzeba zrobić przezroczyste okna i okienka zawartości półprzezroczyste. To wszystko oznacza, dodaje się do okienka zawartości nadal będą świadczone bez dodatkowych 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

Wow, dziękuję bardzo za pomoc. Czy to było dużo pracy? Wygląda na to, że spędzasz dużo czasu, robiąc badania o. O. – r1nzler

+3

Nope - Rób takie rzeczy przez cały czas;) – MadProgrammer

+2

+1, fajne. Nie grałem zbyt wiele z JDK7. Nie zdawałem sobie sprawy, że tak łatwo jest uczynić okno najwyższego poziomu przezroczystym. Wygląda na to, że wszystko, co musisz zrobić, to użyć koloru tła trasparent. – camickr