0
我想設置JTextField的透明文本顏色,表示JTextField上的文本顏色應該與添加了JTextField的JFrame的顏色相同。請告訴我該怎麼做?如何設置JTextField的透明文本顏色
我想設置JTextField的透明文本顏色,表示JTextField上的文本顏色應該與添加了JTextField的JFrame的顏色相同。請告訴我該怎麼做?如何設置JTextField的透明文本顏色
這可能是一個巨大的矯枉過正,但我明白的問題,本質上來說,這樣做是使文本「透明」或出現「切出」的文本字段的...
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
小號任何方式之一...
好吧,這似乎並沒有什麼意義,那麼你不會無法閱讀文本?你能看到一個例子嗎? – MadProgrammer 2015-02-23 03:10:12