---
category: swing
folder: TranslucentTextField
title: JTextFieldの背景色を半透明にする
tags: [JTextField, Translucent]
author: aterai
pubdate: 2008-08-11T12:27:41+09:00
description: JTextFieldの背景色を半透明にしても、文字列選択やキャレットの点滅などで描画が乱れないようにする方法をテストします。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTV03Q10yI/AAAAAAAAAoQ/xH8xmeARg4k/s800/TranslucentTextField.png
---
* 概要 [#summary]
`JTextField`の背景色を半透明にしても、文字列選択やキャレットの点滅などで描画が乱れないようにする方法をテストします。

#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTV03Q10yI/AAAAAAAAAoQ/xH8xmeARg4k/s800/TranslucentTextField.png)

* サンプルコード [#sourcecode]
#code(link){{
Color BG_COLOR = new Color(1f, .8f, .8f, .2f);

field0 = new JTextField("aaaaaaaaa");
field0.setBackground(BG_COLOR);

field1 = new JTextField("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
field1.setOpaque(false);
field1.setBackground(BG_COLOR);

field2 = new JTextField("cccccccccccccccccccccc") {
  @Override protected void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D) g.create();
    g2.setPaint(getBackground());
    g2.fillRect(0, 0, getWidth(), getHeight());
    g2.dispose();
    super.paintComponent(g);
  }
};
field2.setOpaque(false);
field2.setBackground(BG_COLOR);
}}

* 解説 [#explanation]
上記のサンプルでは、それぞれアルファ値を使った半透明の背景色を`JTextField`に設定しています。

+ `setOpaque(true)`
-- 文字列を選択すると、キャレットの点滅などで残像が表示されてしまう
-- `NimbusLookAndFeel`では、発生しない
+ `setOpaque(false)`
-- `setOpaque(false)`とすると、背景色は描画されない
-- `NimbusLookAndFeel`では、背景色が描画される
- `0`: `setOpaque(true)`
-- 文字列を選択すると、キャレットの点滅などの再描画で残像が表示されてしまう
-- `NimbusLookAndFeel`では発生しない
- `1`: `setOpaque(false)`
-- `setOpaque(false)`とすると背景色は描画されない
-- `NimbusLookAndFeel`では背景色が描画される
--- 参考: [http://weblogs.java.net/blog/ljnelson/archive/2008/07/nimbus_and_opac.html Laird Nelson's Blog: Nimbus and Opacity]
+ `1 + paintComponent`
- `2`: `1 + paintComponent`
-- `setOpaque(false)`を設定、かつ`paintComponent`をオーバーライドして背景色を描画

----
- `NimbusLookAndFeel`でのスクリーンショット

#ref(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQcFKxPuBpI/AAAAAAAAAqw/1P6cGhtr7FA/s800/TranslucentTextField1.png)

- `GTKLookAndFeel`でのスクリーンショット
-- [https://bugs.openjdk.java.net/browse/JDK-6531760 Bug ID: 6531760 JTextField not honoring the background color]

#ref(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTV55zD1gI/AAAAAAAAAoY/0PCTmGDb2AA/s800/TranslucentTextField2.png)

* 参考リンク [#reference]
- [http://www.viva-edo.com/komon/edokomon.html 江戸の文様(和風素材・デスクトップ壁紙)]
-- 背景画像として名物裂から雲鶴を借用
- [https://tips4java.wordpress.com/2009/05/31/backgrounds-with-transparency/ Backgrounds With Transparency « Java Tips Weblog]

* コメント [#comment]
#comment
#comment