TITLE:JComboBoxの内余白

Posted by at 2007-05-28

JComboBoxの内余白

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

  • &jnlp;
  • &jar;
  • &zip;
PaddingComboBox.png

サンプルコード

Border padding = BorderFactory.createEmptyBorder(0,5,0,0);
ListCellRenderer lcr = combo.getRenderer();
((JLabel)lcr).setBorder(padding);
combo.setRenderer(lcr);
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、`JComboBoxに、Border(EmptyBorderMatteBorderを切り替え可能)を設定したListCellRendererを設定して、ドロップダウンリストの左余白をすこし広げています。JComboBox`が編集不可の場合、エディタ部分もこの余白が自動的に適用されます。

  • `0`:編集不可
    • `ListCellRenderer`で余白を指定

以下は、`JComboBox`が編集可の場合のテストです。

  • `1: テキストフィールドの元Border + 任意のBorder`で余白を設定
    • `editor.setBorder(BorderFactory.createCompoundBorder(editor.getBorder(), padding));`
    • `JComboBox#getEditor()#getEditorComponent()で取得したJTextField`に余白を指定
    • `JDK 1.5`では余白を指定しても反映されない
    • `JDK 1.6では取得したJTextFieldをsetOpaque(true)`としないと背景色は反映されない
  • `2: テキストフィールドの元Borderは無視して任意のBorder`のみで余白を設定
    • `editor.setBorder(padding);`
    • `JComboBox#getEditor()#getEditorComponent()で取得したJTextField`に余白を指定
    • `MetalLookAndFeel`でテキストフィールドの枠が描画できない

  • `3: テキストフィールドのInsets + 5`ピクセル余白を設定
    • `editor.setMargin(new Insets(i.top,i.left+5,i.bottom,i.right));`
    • `MetalLookAndFeel, MotifLookAndFeel, WindowsLookAndFeel`などでは無効
    • `NimbusLookAndFeelでは有効だが、JComboBox`の高さなども変化してしまう
  • `4: テキストフィールドのMargin + 5`ピクセル余白を設定
    • `editor.setMargin(new Insets(m.top,m.left+5,m.bottom,m.right));`
    • `MetalLookAndFeel, MotifLookAndFeel, WindowsLookAndFeel`などでは無効
    • `NimbusLookAndFeel`では有効

  • `5: JComboBoxのBorder + 任意のBorderで余白をJComboBox`自身に設定
    • `JComboBox#setBorder()で、元のBorder`の内側に余白を指定
    • `WindowsLookAndFeel, MotifLookAndFeel`で有効?
    • `MetalLookAndFeel, NimbusLookAndFeelでは、JComboBox`の外側に余白が付く
  • `6: JComboBoxBorder + 任意のBorderで余白をJComboBox`自身に設定
    • `JComboBox#setBorder()で、元のBorder`の外側に余白を指定
    • `WindowsLookAndFeel`で余計な枠が表示される?

その他にも、以下のように余白を設定する方法もありますが、`LookAndFeel`によって対応が異なるようです。

UIManager.put("ComboBox.padding", new InsetsUIResource(insets));

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

PaddingComboBox1.png

  • `LookAndFeel毎にJComboBox`の余白の描画は異なるみたいなので、全部まとめて消すのは難しい?
  • `BasicComboBoxUIも、ComboBox.buttonDarkShadowArrowButton`の三角とボタンの影に使われていて微妙
    • `BasicComboBoxUI#createArrowButton()`をオーバーライドして別途三角形アイコンを使う方がよさそう

コードは、JComboBoxのBorderを変更するに移動。

参考リンク

コメント

  • なんだか、よく分からなくなってきましたorz。 -- aterai
    • `JDK 1.6.0_10-beta-b22で、BasicComboBoxUIpadding`にすこし修正が入っている?ようです。
  • `L&F`の切り替えなどを追加しました。 -- aterai
  • `1.7.0_06NimbusなどのComboBox.popupInsets`が修正? Bug ID: 7158712 Synth Property "ComboBox.popupInsets" is ignored -- aterai