Swing/TreeComboBox のバックアップ(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TreeComboBox へ行く。
- 1 (2011-07-12 (火) 19:35:10)
- 2 (2011-07-13 (水) 19:02:23)
- 3 (2012-12-19 (水) 22:13:50)
- 4 (2013-08-17 (土) 00:55:42)
- 5 (2015-01-09 (金) 14:16:08)
- 6 (2015-03-19 (木) 16:33:15)
- 7 (2016-05-27 (金) 15:32:36)
- 8 (2017-08-29 (火) 16:10:07)
- 9 (2018-02-22 (木) 19:13:58)
- 10 (2020-02-13 (木) 15:13:08)
- 11 (2021-07-30 (金) 04:22:23)
- 12 (2024-02-10 (土) 17:44:41)
- title: JComboBoxのItemをTree状に表示する tags: [JComboBox, TreeModel] author: aterai pubdate: 2011-07-11T15:16:42+09:00 description: JComboBoxのドロップダウンリストに表示するItemをTree状に配置します。
概要
JComboBox
のドロップダウンリストに表示するItem
をTree
状に配置します。
Screenshot
Advertisement
サンプルコード
class TreeComboBox extends JComboBox {
public TreeComboBox() {
super();
setRenderer(new DefaultListCellRenderer() {
@Override public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
JComponent c;
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
int indent = 2 + (index < 0 ? 0 : (node.getPath().length - 2) * 16);
if (node.isLeaf()) {
c = (JComponent) super.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
} else {
c = (JComponent) super.getListCellRendererComponent(
list, value, index, false, false);
JLabel l = (JLabel) c;
l.setForeground(Color.WHITE);
l.setBackground(Color.GRAY.darker());
}
c.setBorder(BorderFactory.createEmptyBorder(0, indent, 0, 0));
} else {
c = (JComponent) super.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
}
return c;
}
});
Action up = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
int si = getSelectedIndex();
for (int i = si - 1; i >= 0; i--) {
Object o = getItemAt(i);
if (o instanceof TreeNode && ((TreeNode) o).isLeaf()) {
setSelectedIndex(i);
break;
}
}
}
};
Action down = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
int si = getSelectedIndex();
for (int i = si + 1; i < getModel().getSize(); i++) {
Object o = getItemAt(i);
if (o instanceof TreeNode && ((TreeNode) o).isLeaf()) {
setSelectedIndex(i);
break;
}
}
}
};
ActionMap am = getActionMap();
am.put("selectPrevious3", up);
am.put("selectNext3", down);
InputMap im = getInputMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "selectPrevious3");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_KP_UP, 0), "selectPrevious3");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "selectNext3");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_KP_DOWN, 0), "selectNext3");
}
private boolean isNotSelectableIndex = false;
@Override public void setPopupVisible(boolean v) {
if (!v && isNotSelectableIndex) {
isNotSelectableIndex = false;
} else {
super.setPopupVisible(v);
}
}
@Override public void setSelectedIndex(int index) {
Object o = getItemAt(index);
if (o instanceof TreeNode && !((TreeNode) o).isLeaf()) {
isNotSelectableIndex = true;
} else {
super.setSelectedIndex(index);
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、TreeModel
から取得したTreeNode
をJComboBox
のItem
として、ドロップダウンリストに表示しています。
TreeNode#isLeaf()
の場合だけ、選択可能- 子要素のインデントは
BorderFactory.createEmptyBorder(0,indent,0,0)
参考リンク
- Tree inside JComboBox - Santhosh Kumar's Weblog
- こちらで解説されているサンプルでは、
TreeCellRenderer
を使っているのでノードアイコンなどもJTree
のものを表示できるようになっています。
- こちらで解説されているサンプルでは、
- JComboBoxのアイテムを選択不可にする