2013-05-01 126 views
3

如何使JTextField半透明?我需要大約50%的alpha作爲文本字段的背景。半透明文本域

我試過textField.setOpaque(false)然後textField.setBackground(new Color(0,0,0,128)),但它結束了完全透明。我也嘗試過,沒有將不透明設置爲false,並且每次輸入時textField都變得不那麼透明。

+0

它是一個平視顯示器的遊戲,所以用戶需要能夠看清楚它,但他們也需要能夠知道它在哪裏(只是一個邊框使它看起來像一個盒子)。 SSCCE即將進入... – jedyobidan 2013-05-01 02:40:30

回答

4

我也嘗試過,沒有設置不透明爲false,並且textField在每次輸入時變得不那麼透明。

請參閱Background With Transparency瞭解爲什麼發生這種情況和解決方案。

+0

我明白爲什麼會發生這種情況,但是有沒有解決方法? – jedyobidan 2013-05-01 02:38:46

+0

爲什麼當你不打算閱讀整個答案並按照鏈接提問時,你會問問題? – camickr 2013-05-01 02:39:44

+0

我以前看過那個頁面,但我不太瞭解Alpha容器。當我向GUI添加半透明組件時,是否只構造一個新的AlphaContainer? 是的,我忘了閱讀答案的「和解決方案」部分;對於那個很抱歉。 – jedyobidan 2013-05-01 02:43:28

5

在油漆鏈中的某個點,你需要控制。

最簡單的方法是覆蓋文本字段的paint方法並調整圖形複合以提供所需的透明度。

這帶有一些額外的問題。文本字段必須是透明的(不透明== false),否則最終會產生重繪文物。您還需要手動填寫領域的背景下,作爲字段設置爲透明停止它畫它自己的背景...

enter image description here

import java.awt.AlphaComposite; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagLayout; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestTransparentTextField { 

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

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

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private BufferedImage background; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      add(new TransparentTextField("Look ma, no opacity!", 20)); 
      try { 
       background = ImageIO.read(new File("/get/your/own/image")); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if (background != null) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       int x = (getWidth() - background.getWidth())/2; 
       int y = (getHeight()- background.getHeight())/2; 
       g2d.drawImage(background, x, y, this); 
       g2d.dispose(); 
      } 
     } 
    } 

    public class TransparentTextField extends JTextField { 

     public TransparentTextField(String text) { 
      super(text); 
      init(); 
     } 

     public TransparentTextField(int columns) { 
      super(columns); 
      init(); 
     } 

     public TransparentTextField(String text, int columns) { 
      super(text, columns); 
      init(); 
     } 

     protected void init() { 
      setOpaque(false); 
     } 

     @Override 
     public void paint(Graphics g) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f)); 
      super.paint(g2d); 
      g2d.dispose(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(getBackground()); 
      g2d.fillRect(0, 0, getWidth(), getHeight()); 
      super.paintComponent(g2d); 
      g2d.dispose(); 
     } 

    } 
} 
+0

+ 1,這種方法(覆蓋油漆)使背景和文字透明。 – camickr 2013-05-01 03:03:28