2015-02-23 38 views
0

我想設置JTextField的透明文本顏色,表示JTextField上的文本顏色應該與添加了JTextField的JFrame的顏色相同。請告訴我該怎麼做?如何設置JTextField的透明文本顏色

+0

好吧,這似乎並沒有什麼意義,那麼你不會無法閱讀文本?你能看到一個例子嗎? – MadProgrammer 2015-02-23 03:10:12

回答

1

這可能是一個巨大的矯枉過正,但我​​明白的問題,本質上來說,這樣做是使文本「透明」或出現「切出」的文本字段的...

enter image description here

public class CutoutTextField extends JTextField { 

    public CutoutTextField() { 
     init(); 
    } 

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

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

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

    public CutoutTextField(Document doc, String text, int columns) { 
     super(doc, text, columns); 
     init(); 
    } 

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

    @Override 
    protected void paintComponent(Graphics g) { 
     TextUI ui = getUI(); 

     // This is JUST the text 
     BufferedImage img = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); 
     Graphics2D ig = img.createGraphics(); 
     applyQualityRenderingHints(ig); 
     ui.paint(ig, this); 
     ig.dispose(); 

     // This is the background of the field... 
     BufferedImage bg = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); 
     ig = bg.createGraphics(); 
     applyQualityRenderingHints(ig); 
     ig.setColor(getBackground()); 
     ig.fillRect(0, 0, getWidth(), getHeight()); 
     ig.dispose(); 

     BufferedImage masked = ImageUtilities.applyMask(img, bg, AlphaComposite.XOR); 
     int y = (getHeight() - masked.getHeight())/2; 
     g.drawImage(masked, 0, y, this); 
    } 

    public BufferedImage applyMask(BufferedImage sourceImage, BufferedImage maskImage, int method) { 

     BufferedImage maskedImage = null; 
     if (sourceImage != null) { 

      int width = maskImage.getWidth(null); 
      int height = maskImage.getHeight(null); 

      maskedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
      Graphics2D mg = maskedImage.createGraphics(); 
      applyQualityRenderingHints(mg); 

      int x = (width - sourceImage.getWidth(null))/2; 
      int y = (height - sourceImage.getHeight(null))/2; 

      mg.drawImage(sourceImage, x, y, null); 
      mg.setComposite(AlphaComposite.getInstance(method)); 

      mg.drawImage(maskImage, 0, 0, null); 

      mg.dispose(); 

     } 

     return maskedImage; 

    } 

    public void applyQualityRenderingHints(Graphics2D g2d) { 

     g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); 
     g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
     g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); 

    } 

} 

明白,這是一個巨大的破解!

什麼這基本上呢,是描繪從字段中的文本到BufferedImage,它接着產生一單獨的BufferedImage填充字段的背景顏色,然後XOR的兩個圖像一起,有效地切割所述文本出的背景。然後它簡單地繪製結果BufferedImage

有些人會注意到我沒有打電話super.paintComponent,這是故意做的,因爲我不希望該字段繪製背景和文本,但想要控制過程。

這是可能的,因爲該領域是透明的,那我可以打電話給super.paintComponent,但我會畫到BufferedImage小號任何方式之一...