JComboBoxの内余白
Total: 14669, Today: 1, Yesterday: 1
Posted by aterai at
Last-modified:
Summary
JComboBoxのエディタなどに内余白を設定します。
Screenshot

Advertisement
Source Code Examples
static Border padding = BorderFactory.createEmptyBorder(0, 5, 0, 0);
// ...
DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
model.addElement("aaaaaaaaaaaaaaaaaaaaaaaaa");
model.addElement("aaaabbb");
model.addElement("aaaabbbcc");
model.addElement("bbb1");
model.addElement("bbb12");
JComboBox<String> combo = new JComboBox<String>(model) {
@Override public void updateUI() {
setRenderer(null);
super.updateUI();
ListCellRenderer<? super String> lcr = getRenderer();
setRenderer(new ListCellRenderer<String>() {
@Override public Component getListCellRendererComponent(
JList<? extends String> list, String value, int index,
boolean isSelected, boolean hasFocus) {
JLabel l = (JLabel) lcr.getListCellRendererComponent(
list, value, index, isSelected, hasFocus);
l.setBorder(padding);
return l;
}
});
// XXX JDK 1.7.0 ?: ((JLabel) lcr).setBorder(padding);
}
};
View in GitHub: Java, KotlinDescription
上記のサンプルでは、JComboBoxにBorder(EmptyBorderとMatteBorderを切り替え可能)を設定したListCellRendererを設定して、ドロップダウンリストの左余白をすこし広げています。JComboBoxが編集不可の場合、エディタ部分もこの余白が自動的に適用されます。
0:編集不可ListCellRendererで余白を指定
1:JComboBoxが編集可 + テキストフィールドの元Border+ 任意のBorderで余白を設定editor.setBorder(BorderFactory.createCompoundBorder(editor.getBorder(), padding));JComboBox#getEditor()#getEditorComponent()で取得したJTextFieldに余白を指定JDK 1.5では余白を指定しても反映されないJDK 1.6では取得したJTextFieldをsetOpaque(true)としないと背景色は反映されない
2:JComboBoxが編集可 + テキストフィールドの元Borderは無視して任意のBorderのみで余白を設定editor.setBorder(padding);JComboBox#getEditor()#getEditorComponent()で取得したJTextFieldに余白を指定MetalLookAndFeelでテキストフィールドの枠が描画できない
3:JComboBoxが編集可 + テキストフィールドのInsets+5ピクセル余白を設定editor.setMargin(new Insets(i.top,i.left+5,i.bottom,i.right));MetalLookAndFeel、MotifLookAndFeel、WindowsLookAndFeelなどでは無効NimbusLookAndFeelでは有効だがJComboBoxの高さなども変化してしまう
4:JComboBoxが編集可 + テキストフィールドのMargin+5ピクセル余白を設定editor.setMargin(new Insets(m.top,m.left+5,m.bottom,m.right));MetalLookAndFeel、MotifLookAndFeel、WindowsLookAndFeelなどでは無効NimbusLookAndFeelでは有効
5:JComboBoxが編集可 +JComboBoxのBorder+ 任意のBorderで余白をJComboBox自身に設定JComboBox#setBorder()で元のBorderの内側に余白を指定WindowsLookAndFeel、MotifLookAndFeelで有効?MetalLookAndFeel、NimbusLookAndFeelではJComboBoxの外側に余白が付く
6:JComboBoxが編集可 +JComboBoxのBorder+ 任意のBorderで余白をJComboBox自身に設定JComboBox#setBorder()で元のBorderの外側に余白を指定WindowsLookAndFeelで余計な枠が表示される?
その他にも、以下のようにUIManagerで余白を設定する方法もあるがLookAndFeelによって対応が異なる?ComboBox.paddingは無くなっている?JComboBoxが編集可能の場合はComboBox.editorBorderが有効かもしれない// UIManager.put("ComboBox.padding", new InsetsUIResource(insets)); UIManager.put("ComboBox.editorBorder", BorderFactory.createEmptyBorder(0, 5, 0, 0));
上記のサンプルを余白に色無しにしてUbuntu 7.04(GNOME 2.18.1)、JDK 1.6.0で実行すると、以下のように表示される
LookAndFeel毎にJComboBoxの余白の描画は異なるみたいなので、全部まとめて消すのは難しい?BasicComboBoxUIも、ComboBox.buttonDarkShadowがArrowButtonの三角とボタンの影に使われていて微妙BasicComboBoxUI#createArrowButton()をオーバーライドして別途三角形アイコンを使う方がよさそう- コードは、JComboBoxのBorderを変更するに移動
Reference
- JComboBoxにアイコンを表示
- JDK-4515838 Can't change the border of a JComboBox - Java Bug System
- JDK-8179027 JComboBox too small under Windows LAF - Java Bug System
- 上記のスクリーンショットのような
WindowsLookAndFeelでJComboBoxの高さが小さすぎる件が修正される?
- 上記のスクリーンショットのような
