コンボボックスのポップアップ幅の自動調整
仕事で作ったけど必要なくなったので記録としてエントリーしました.
通常のJComboBoxのポップアップはJComboBoxの幅に合わせて表示されます.
以下のコードは表示幅が狭い場合などポップアップ内のアイテムの文字が切れてしまうのを防ぎます.
// コンボボックス幅が狭い場合のポップアップ調整 PopupMenuListener minWidthPopupMenuListener = new PopupMenuListener() { private boolean adjusting = false; public void popupMenuWillBecomeVisible(PopupMenuEvent e) { JComboBox combo = (JComboBox)e.getSource(); Dimension size = combo.getSize(); ListCellRenderer renderer = combo.getRenderer(); JList list = new JList(); list.setFont(combo.getFont()); // コンボボックスとレンダラーの結果から最適な幅を計算 int width = combo.getWidth(); int itemCount = combo.getItemCount(); for (int index = 0; index < itemCount; index++) { Object value = combo.getItemAt(index); Component comp = renderer.getListCellRendererComponent( list, value, index, false, false); if (comp != null) { int w = comp.getPreferredSize().width + 5; if (width < w) { width = w; } } } if (!adjusting) { adjusting = true; combo.setSize(width, size.height); combo.showPopup(); } combo.setSize(size); adjusting = false; } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {} public void popupMenuCanceled(PopupMenuEvent e) {} }; combobox.addPopupMenuListener(minWidthPopupMenuListener);
こんなことしなくてもコンボボックスのアイテムが長いの駄目なんだろうけど...