Swing/PaddingComboBox のバックアップ差分(No.32)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/PaddingComboBox へ行く。
- 1 (2007-05-28 (月) 05:42:18)
- 2 (2007-05-28 (月) 08:31:24)
- 3 (2007-05-29 (火) 11:53:06)
- 4 (2007-05-29 (火) 16:45:04)
- 5 (2008-02-20 (水) 11:18:34)
- 6 (2008-03-11 (火) 21:35:33)
- 7 (2008-03-12 (水) 13:07:36)
- 8 (2008-03-12 (水) 19:32:52)
- 9 (2008-04-02 (水) 20:00:09)
- 10 (2008-04-05 (土) 20:40:17)
- 11 (2008-04-10 (木) 15:41:06)
- 12 (2008-04-26 (土) 01:14:40)
- 13 (2012-02-17 (金) 17:21:59)
- 14 (2012-02-20 (月) 16:52:13)
- 15 (2012-08-15 (水) 13:58:34)
- 16 (2013-02-06 (水) 02:25:41)
- 17 (2013-08-18 (日) 01:05:22)
- 18 (2013-11-19 (火) 15:34:53)
- 19 (2013-11-19 (火) 16:39:14)
- 20 (2014-11-01 (土) 00:46:09)
- 21 (2015-02-19 (木) 18:39:01)
- 22 (2015-03-07 (土) 15:41:01)
- 23 (2016-05-28 (土) 18:22:13)
- 24 (2016-06-01 (水) 18:41:10)
- 25 (2017-05-01 (月) 20:44:07)
- 26 (2017-08-18 (金) 17:56:46)
- 27 (2017-11-02 (木) 15:34:40)
- 28 (2018-08-28 (火) 14:43:50)
- 29 (2019-05-22 (水) 19:35:38)
- 30 (2020-08-20 (木) 16:53:53)
- 31 (2022-01-27 (木) 14:24:55)
- 32 (2022-08-20 (土) 22:15:25)
- 追加された行はこの色です。
- 削除された行はこの色です。
--- category: swing folder: PaddingComboBox title: JComboBoxの内余白 tags: [JComboBox, Border, LookAndFeel, JTextField] author: aterai pubdate: 2007-05-28T05:42:18+09:00 description: JComboBoxのエディタなどに内余白を設定します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQv1E_b9I/AAAAAAAAAgE/nxvnwwFoDyU/s800/PaddingComboBox.png --- * 概要 [#summary] `JComboBox`のエディタなどに内余白を設定します。 #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQv1E_b9I/AAAAAAAAAgE/nxvnwwFoDyU/s800/PaddingComboBox.png) * サンプルコード [#sourcecode] #code(link){{ 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); } }; }} * 解説 [#explanation] 上記のサンプルでは、`JComboBox`に`Border`(`EmptyBorder`と`MatteBorder`を切り替え可能)を設定した`ListCellRenderer`を設定して、ドロップダウンリストの左余白をすこし広げています。`JComboBox`が編集不可の場合、エディタ部分もこの余白が自動的に適用されます。 - `0`:編集不可 -- `ListCellRenderer`で余白を指定 ---- 以下は`JComboBox`が編集可の場合のテストです。 - `1`: テキストフィールドの元`Border` + 任意の`Border`で余白を設定 - `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`: テキストフィールドの元`Border`は無視して任意の`Border`のみで余白を設定 - `2`: `JComboBox`が編集可 + テキストフィールドの元`Border`は無視して任意の`Border`のみで余白を設定 -- `editor.setBorder(padding);` -- `JComboBox#getEditor()#getEditorComponent()`で取得した`JTextField`に余白を指定 -- `MetalLookAndFeel`でテキストフィールドの枠が描画できない ---- - `3`: テキストフィールドの`Insets` + `5`ピクセル余白を設定 - `3`: `JComboBox`が編集可 + テキストフィールドの`Insets` + `5`ピクセル余白を設定 -- `editor.setMargin(new Insets(i.top,i.left+5,i.bottom,i.right));` -- `MetalLookAndFeel`、`MotifLookAndFeel`、`WindowsLookAndFeel`などでは無効 -- `NimbusLookAndFeel`では有効だが`JComboBox`の高さなども変化してしまう - `4`: テキストフィールドの`Margin` + `5`ピクセル余白を設定 - `4`: `JComboBox`が編集可 + テキストフィールドの`Margin` + `5`ピクセル余白を設定 -- `editor.setMargin(new Insets(m.top,m.left+5,m.bottom,m.right));` -- `MetalLookAndFeel`、`MotifLookAndFeel`、`WindowsLookAndFeel`などでは無効 -- `NimbusLookAndFeel`では有効 ---- - `5`: `JComboBox`の`Border` + 任意の`Border`で余白を`JComboBox`自身に設定 - `5`: `JComboBox`が編集可 + `JComboBox`の`Border` + 任意の`Border`で余白を`JComboBox`自身に設定 -- `JComboBox#setBorder()`で元の`Border`の内側に余白を指定 -- `WindowsLookAndFeel`、`MotifLookAndFeel`で有効? -- `MetalLookAndFeel`、`NimbusLookAndFeel`では`JComboBox`の外側に余白が付く - `6`: `JComboBox`の`Border` + 任意の`Border`で余白を`JComboBox`自身に設定 - `6`: `JComboBox`が編集可 + `JComboBox`の`Border` + 任意の`Border`で余白を`JComboBox`自身に設定 -- `JComboBox#setBorder()`で元の`Border`の外側に余白を指定 -- `WindowsLookAndFeel`で余計な枠が表示される? ---- - %%その他にも、以下のように`UIManager`で余白を設定する方法もあるが`LookAndFeel`によって対応が異なる?%% `ComboBox.padding`は無くなっている? -- `JComboBox`が編集可能の場合は`ComboBox.editorBorder`が有効かもしれない #code{{ // 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`で実行すると、以下のように表示される%% #ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTQyV_2TnI/AAAAAAAAAgI/yqGoi_zqsgI/s800/PaddingComboBox1.png) ---- - `LookAndFeel`毎に`JComboBox`の余白の描画は異なるみたいなので、全部まとめて消すのは難しい? - `BasicComboBoxUI`も、`ComboBox.buttonDarkShadow`が`ArrowButton`の三角とボタンの影に使われていて微妙 -- `BasicComboBoxUI#createArrowButton()`をオーバーライドして別途三角形アイコンを使う方がよさそう -- コードは、[[JComboBoxのBorderを変更する>Swing/ComboBoxBorder]]に移動 * 参考リンク [#reference] - [[JComboBoxにアイコンを表示>Swing/IconComboBox]] - [https://bugs.openjdk.java.net/browse/JDK-4515838 JDK-4515838 Can't change the border of a JComboBox - Java Bug System] - [https://bugs.openjdk.java.net/browse/JDK-8179027 JDK-8179027 JComboBox too small under Windows LAF - Java Bug System] -- 上記のスクリーンショットのような`WindowsLookAndFeel`で`JComboBox`の高さが小さすぎる件が修正される? * コメント [#comment] #comment - %%なんだか、よく分からなくなってきましたorz。%% `JDK 1.6.0_10-beta-b22`で、`BasicComboBoxUI`の`padding`にすこし修正が入っている?ようです。 -- &user(aterai); &new{2008-03-11 (火) 21:38:58}; - `LookAndFeel`の切り替えなどを追加しました。 -- &user(aterai); &new{2008-04-02 (水) 20:08:01}; - `1.7.0_06`で`Nimbus`などの`ComboBox.popupInsets`が修正? [https://bugs.openjdk.java.net/browse/JDK-7158712 Bug ID: 7158712 Synth Property "ComboBox.popupInsets" is ignored] -- &user(aterai); &new{2012-08-15 (水) 13:58:34}; - `Windows 7`の`LookAndFeel`、編集不可の`JComboBox`で、`((JLabel) combo.getRenderer() ).setBorder(padding);`が`JComboBox`本体に効かない(フォーカスのための`Border`のせい?)ため、セルレンダラーを作成して毎回余白を適用するように変更。このため、`Windows 7`の`LookAndFeel`では、`JComboBox`本体の点線によるフォーカス表示が無くなる。 -- &user(aterai); &new{2013-11-19 (火) 15:37:19}; #comment