TITLE:JComboBoxの内余白

JComboBoxの内余白

編集者:Terai Atsuhiro
作成日:2007-05-28
更新日:2022-01-27 (木) 14:24:55

概要

JComboBoxのエディタなどに内余白を設定します。

#screenshot

サンプルコード

//Border padding = BorderFactory.createEmptyBorder(0,5,0,0);
Border padding = BorderFactory.createMatteBorder(0,5,0,0,new Color(1f,.9f,.9f));

final ListCellRenderer lcr = combo00.getRenderer();
((JLabel)lcr).setBorder(padding);

combo00.setRenderer(lcr);
combo01.setRenderer(lcr);
combo02.setRenderer(lcr);

combo00.setEditable(false);
combo01.setEditable(true);
combo02.setEditable(true);

JTextField editor = (JTextField) combo01.getEditor().getEditorComponent();
editor.setBorder(padding);
editor.setOpaque(true);
editor.setBackground(new Color(.9f,1f,.9f));

combo02.setBorder(BorderFactory.createCompoundBorder(combo02.getBorder(), padding));
//combo02.setOpaque(true);
//combo02.setBackground(new Color(.9f,1f,.9f));
  • &jnlp;
  • &jar;
  • &zip;

解説

JComboBoxが編集不可の場合、ListCellRendererで余白を指定することが出来ます。上記のサンプルでは、EmptyBorderの代わりにMatteBorderを使って余白を着色してテストしています。

  • 上:編集不可
    • ListCellRendererで余白を指定
  • 中:編集可
    • ListCellRendererで余白を指定
    • JComboBox#getEditor()#getEditorComponent()で取得したJTextFieldに余白を指定
    • JDK 1.5 では余白を指定しても反映されない
    • JDK 1.6 では取得したJTextFieldをsetOpaque(true)としないと背景色は反映されない
  • 下:編集可
    • ListCellRendererで余白を指定
    • JComboBox#setBorder()で、元のBorderの内側に余白を指定
    • JDK 1.6 では余計な?余白が発生する

以下のようにエディタにMarginを指定しても無視されるようです。

editor = (JTextField) combo.getEditor().getEditorComponent();
Insets m = editor.getMargin();
Insets margin = new Insets(m.top,m.left+10,m.bottom,m.right);
//System.out.println(margin.toString());
editor.setMargin(margin);
  • 追記
    • 無視されるのは、BasicLaF系(WindowsLaFなど)で、SynthLaF系(Nimbus, GTKなど)では上記の設定は有効になる?
    • 1.6.0_10-beta-b13 では、BasicLaF系はUIManager.put("ComboBox.padding", insets) が使用できる?

上記のサンプルを、余白に色無しにして、Ubuntu 7.04(GNOME 2.18.1) JDK 1.6.0 で実行すると、以下のよう*1になります。

#screenshot(,screenshot1.png)

参考リンク

コメント

  • なんだか、よく分からなくなってきましたorz。 -- terai