概要

JTextFieldの背景色を半透明にしても、文字列選択やキャレットの点滅などで描画が乱れないようにする方法をテストします。

サンプルコード

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);
view all

解説

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

  • 0: setOpaque(true)
    • 文字列を選択すると、再描画がおかしくなる(残像が表示される)
    • NimbusLookAndFeelでは、発生しない
  • 1: setOpaque(false)
  • 2: 1 + paintComponent
    • setOpaque(false)を設定、かつpaintComponentをオーバーライドして背景色を描画

  • NimbusLookAndFeelでのスクリーンショット
TranslucentTextField1.png
TranslucentTextField2.png

参考リンク

コメント