Swing/TreeComboBox のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - 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のアイテムを選択不可にする