TITLE:JTextField内にアイコンを追加

JTextField内にアイコンを追加

編集者:Terai Atsuhiro~

作成日:2005-01-03
更新日:2021-05-21 (金) 03:22:02
  • category: swing folder: IconTextField title: JTextField内にアイコンを追加 tags: [JTextField, ImageIcon, JLabel, Border] author: aterai pubdate: 2005-01-03T02:14:18+09:00 description: JTextFieldの内部に余白を生成し、そこにImageIconを設定したJLabelを配置します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTOSatpfJI/AAAAAAAAAcI/9Ghfvb82FsM/s800/IconTextField.png

概要

JTextFieldの内部に余白を生成し、そこにImageIconを設定したJLabelを配置します。

概要

JTextFieldの内部にアイコンを表示します。

サンプルコード

#spanend
#spanadd
ImageIcon image = new ImageIcon(getClass().getResource("16x16.png"));
#spanend
#spanadd
int w = image.getIconWidth();
#spanend
#spanadd
int h = image.getIconHeight();
#spanend

#spandel
#screenshot
#spanend
#spanadd
JTextField field = new JTextField("bbbbbbbbbb");
#spanend
#spanadd
Insets m = field.getMargin();
#spanend
#spanadd
field.setMargin(new Insets(m.top, m.left + w, m.bottom, m.right));
#spanend

#spandel
**サンプルコード [#rc7f0af2]
#spanend
 JLabel label = new JLabel(image);
 label.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
 label.setBorder(null);
 label.setBounds(1,1,image.getIconWidth(),image.getIconHeight());
 Insets m  = field01.getMargin();
 Insets m2 = new Insets(m.top,m.left+image.getIconWidth(),m.bottom,m.right);
 field01.setMargin(m2);
 field01.add(label);
#spanadd
JLabel label = new JLabel(image);
#spanend
#spanadd
label.setCursor(Cursor.getDefaultCursor());
#spanend
#spanadd
label.setBorder(null);
#spanend
#spanadd
label.setBounds(m.left, m.top, w, h);
#spanend

-&jnlp;
-&jar;
-&zip;
#spanadd
field.add(label);
#spanend
#spanadd
View in GitHub: Java, Kotlin

解説

サンプルではsetMarginでJTextFieldの左に余白を作り、そこにJLabelを配置することでアイコンを表示しています。

解説

サンプルではsetMarginJTextFieldの左に余白を作り、そこにJLabelを配置することでアイコン(画像)を表示しています。 JComboBoxにアイコンを追加のように、Borderを使っても同様のことができますが、JTextComponentを継承したコンポーネントでは、setMarginを使用するとカーソルの指定などが簡単にできるのでおすすめです。
  • JComboBoxにアイコンを追加のようにBorderを使用する方法もあるが、JTextComponentを継承するコンポーネントではsetMargin(...)メソッドを使用するとカーソルの指定などが簡単に実現可能
    • JLabelの代わりにJButtonなどのコンポーネントを配置することも可能
  • JComboBoxEditorを取得してMarginを指定しても反映されない
  • JTextComponent#setMargin(...) (Java Platform SE 8)

    ただし、デフォルト以外の境界が設定されている場合は、Borderオブジェクトが適切なマージン空白を作成します(それ以外の場合、このプロパティーは事実上無視される)。

また、JLabelの代わりに、JButtonなどを置くこともできます(参考リンクを参照)。
  • -
  • JTextFieldの右端にJLabelを置く場合は、以下のようにSpringLayoutを使用する方法もある
    • JButtonなどの高さを変更せずに幅を指定
      #spanend
      #spanadd
      final JLabel label2 = new JLabel(image);
      #spanend
      #spanadd
      label2.setCursor(Cursor.getDefaultCursor());
      #spanend
      #spanadd
      label2.setBorder(BorderFactory.createEmptyBorder());
      #spanend
      #spanadd
      JTextField field2 = new JTextField("ccccccccccccccccccccccccccc") {
      #spanend
        @Override public void updateUI() {
          super.updateUI();
          removeAll();
          SpringLayout l = new SpringLayout();
          setLayout(l);
          Spring fw = l.getConstraint(SpringLayout.WIDTH,  this);
          Spring fh = l.getConstraint(SpringLayout.HEIGHT, this);
          SpringLayout.Constraints c = l.getConstraints(label2);
          c.setConstraint(SpringLayout.WEST,  fw);
          c.setConstraint(SpringLayout.SOUTH, fh);
          add(label2);
        }
      #spanadd
      };
      #spanend
      #spanadd
      m = field2.getMargin();
      #spanend
      #spanadd
      field2.setMargin(new Insets(m.top + 2, m.left, m.bottom, m.right + w));
      #spanend
      #spanadd
      
JComboBoxのEditorを取得してMarginを指定しても、なぜかうまくいきません。
JTextField field = (JTextField) combo02.getEditor().getEditorComponent();

参考リンク

参考リンク

コメント

コメント