Swing/ComboItemHeight のバックアップの現在との差分(No.5)
- category: swing folder: ComboItemHeight title: JComboBoxの高さを変更する tags: [JComboBox, ListCellRenderer] author: aterai pubdate: 2009-03-02T12:37:58+09:00 description: JComboBox自体の高さや、ドロップダウンリスト内にあるアイテムの高さを変更します。 image:
概要
概要
JComboBox
自体の高さや、ドロップダウンリスト内にあるアイテムの高さを変更します。
Screenshot
Advertisement
サンプルコード
サンプルコード
#spanadd
JComboBox<String> combo2 = new JComboBox<>(items);
#spanend
#spanadd
combo2.setRenderer(new DefaultListCellRenderer() {
#spanend
private int cheight;
@Override public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
Dimension d = super.getPreferredSize();
cheight = index < 0 ? d.height : 32;
return this;
}
#spanadd
#spanend
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = cheight;
return d;
}
#spanadd
});
#spanend
#spanadd
View in GitHub: Java, Kotlin解説
-
setPreferredSize
- セルレンダラーに
setPreferredSize(...)
メソッドで高さを設定#spanend JComboBox combo1 = new JComboBox(items); JLabel renderer1 = (JLabel) combo1.getRenderer(); renderer1.setPreferredSize(new Dimension(0, 32)); #spanadd
- セルレンダラーに
-
getListCellRendererComponent
- セルレンダラーの
getListCellRendererComponent(...)
メソッド内で、index
が0
以上の場合はgetPreferredSize()
メソッドで取得する高さを切り替える
- セルレンダラーの
-
html
-
html
タグを使用してセルレンダラーに高さを指定#spanend #spanadd JComboBox<String> combo3 = new JComboBox<>(items); #spanend #spanadd combo3.setRenderer(new DefaultListCellRenderer() { #spanend @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component c = r.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); c.setPreferredSize(new Dimension(100, (index < 0) ? dim.height : 32)); return c; String title = Objects.toString(value, ""); if (index >= 0) { title = String.format("<html><table><td height='32'>%s", value); } return super.getListCellRendererComponent(list, title, index, isSelected, cellHasFocus); } });
-
解説
- 上
- レンダラーに
setPreferredSize
で高さを設定しています。
- レンダラーに
-
icon
- 幅ゼロのアイコンを使用してセルレンダラーに高さを指定
#spanend #spanadd JComboBox<String> combo4 = new JComboBox<>(items); #spanend #spanadd combo4.setRenderer(new DefaultListCellRenderer() { #spanend @Override public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (index >= 0) { setIcon(new Icon() { @Override public void paintIcon(Component c, Graphics g, int x, int y) {} @Override public int getIconWidth() { return 0; } @Override public int getIconHeight() { return 32; } }); } else { setIcon(null); } //setIconTextGap(0); return this; } #spanadd }); #spanend #spanadd
- 幅ゼロのアイコンを使用してセルレンダラーに高さを指定
- 下
- レンダラーの
getListCellRendererComponent
で、index
が0
以上の時だけ、高さを変更しています。- -
- レンダラーの
-
DefaultListCellRenderer
を編集可能にしたJComboBox
に設定すると、リストアイテム文字列が空""
の場合、ドロップダウンリスト内でのそのアイテムの高さが余白分のみ(2px
)になってしまう- 参考: java - DefaultListCellRenderer does not render empty String correctly when using an editable combo box - Stack Overflow
- 上記のサンプルも
DefaultListCellRenderer
を使用しているが、直接高さを指定しているので編集可にしてもこの状態にはならない -
JComboBox#setPrototypeDisplayValue(...)
で文字列を設定していても、高さには効果がない - 回答にある
BasicComboBoxRenderer
でこの状態にならない理由は、以下のようにBasicComboBoxRenderer#getPreferredSize()
をオーバーライドし、空白文字を一時的に追加してから高さを求めているため#spanend #spanadd @Override public Dimension getPreferredSize() { #spanend Dimension size; if ((this.getText() == null) || (this.getText().equals(""))) { setText(" "); size = super.getPreferredSize(); setText(""); } else { size = super.getPreferredSize(); } return size; #spanadd } #spanend #spanadd