2015-09-14 42 views
-1

我正在尋找一些解決方案,以將不透明,空JFrame背景變成透明(無半透明),但顯示按鈕容器等擺動組件... 這裏的一個例子。設置JFrame背景透明,但顯示內容

默認的JFrame

http://i.picasion.com/resize80/5c005816e8bd52d0d3325551ef14b1b1.jpg

喜歡的東西,這裏禁用背景

http://i.picasion.com/resize80/742f5a46663852643b8aef69436e6dba.jpg

回答

1

這是一個簡單的兩個步驟...

首先,你需要做一個透明的框架...

JFrame frame = new JFrame("Testing"); 
frame.setUndecorated(true); 
frame.setBackground(new Color(0, 0, 0, 0)); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.add(new TestPane()); 
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 

對於你想看穿,你需要確保它的設置是透明的,例如每個組件...

public class TestPane extends JPanel { 

    public TestPane() { 
     setOpaque(false); 
     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = 0; 
     gbc.gridy = 0; 
     gbc.insets = new Insets(4, 4, 4, 4); 
     add(new JLabel("Product"), gbc); 
     gbc.gridy++; 
     add(new JLabel("Company"), gbc); 
     gbc.gridy++; 
     add(new JLabel("Phone"), gbc); 

     gbc.gridx++; 
     gbc.gridy = 0; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     add(new JTextField(10), gbc); 
     gbc.gridy++; 
     add(new JComboBox(), gbc); 
     gbc.gridy++; 
     add(new JTextField(10), gbc); 

     JPanel buttons = new JPanel(); 
     buttons.setOpaque(false); 
     buttons.add(new JButton("Add")); 
     buttons.add(new JButton("Update")); 
     buttons.add(new JButton("Delete")); 
     gbc.gridx = 0; 
     gbc.gridy++; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     add(buttons, gbc); 

     gbc.gridy++; 
     JPanel filler = new JPanel(); 
     filler.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
     add(filler, gbc); 

     gbc.gridy++; 
     gbc.fill = GridBagConstraints.BOTH; 
     add(new JScrollPane(new JTable(new DefaultTableModel(new String[]{"Product", "Company", "Phone"}, 0))), gbc); 

    } 

} 

TransparentFrame

而且可運行的例子.. 。

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.border.CompoundBorder; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 
import javax.swing.table.DefaultTableModel; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setUndecorated(true); 
       frame.setBackground(new Color(0, 0, 0, 0)); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setOpaque(false); 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.insets = new Insets(4, 4, 4, 4); 
      add(new JLabel("Product"), gbc); 
      gbc.gridy++; 
      add(new JLabel("Company"), gbc); 
      gbc.gridy++; 
      add(new JLabel("Phone"), gbc); 

      gbc.gridx++; 
      gbc.gridy = 0; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      add(new JTextField(10), gbc); 
      gbc.gridy++; 
      add(new JComboBox(), gbc); 
      gbc.gridy++; 
      add(new JTextField(10), gbc); 

      JPanel buttons = new JPanel(); 
      buttons.setOpaque(false); 
      buttons.add(new JButton("Add")); 
      buttons.add(new JButton("Update")); 
      buttons.add(new JButton("Delete")); 
      gbc.gridx = 0; 
      gbc.gridy++; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      add(buttons, gbc); 

      gbc.gridy++; 
      JPanel filler = new JPanel(); 
      filler.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(10, 10, 10, 10))); 
      add(filler, gbc); 

      gbc.gridy++; 
      gbc.fill = GridBagConstraints.BOTH; 
      add(new JScrollPane(new JTable(new DefaultTableModel(new String[]{"Product", "Company", "Phone"}, 0))), gbc); 

     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.dispose(); 
     } 

    } 

} 

這也是一個偉大的方式,採取 「假」 半透明邊框...

Translucent Frame

public class TestPane extends JPanel { 

    //... 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setColor(getBackground()); 
     g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
     g2d.dispose(); 
    } 

} 
+0

嘛,我發現了一個簡單的方法,您發佈的只是設置undecurated和你的答案XD之前的setBackground(0,0,0,0),並沒有設定不透明面板...但無論如何感謝:P – Refer