首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jtree和组合框布局

Jtree和组合框布局
EN

Stack Overflow用户
提问于 2016-08-02 15:12:54
回答 1查看 217关注 0票数 1

所以我有一个JTree,它将有不同数量的叶子和节点,我需要在树的叶子旁边添加JComboBoxes,而不是树的其他部分。我尝试使用树叶的屏幕位置和边框布局来实现这一点,但是当我有很多叶子时,盒子总是会掉下来,而且当我有很多叶子的时候,它们似乎也只是定位在一个位置,并且随着每个新的组合框的添加,它们也会变得越来越薄。我怎么可能实现我想要的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-02 17:34:06

我需要在树的叶子旁边添加JComboBoxes,而不是树的其他部分。

考虑创建自己的TreeCellRenderer,将JComboBox直接集成到JTree中。为了允许对JComboBox进行编辑,您还需要实现一个TreeCellEditor,该TreeCellEditor处理编辑组件和该组件在编辑完成时发生的操作。下面是一个非常简单的例子,它将JComboBox放在JLabel旁边,放在JTree的叶子上。

代码语言:javascript
运行
复制
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
DefaultTreeModel model = new DefaultTreeModel(root);
final JTree tree = new JTree(model);

//flyweight pattern components
//editor
final JComboBox editorComboBox = new JComboBox();
final JComboBox viewComboBox = new JComboBox();
final Box box = Box.createHorizontalBox();
final JLabel myLabel = new JLabel();
myLabel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 10));
box.add(myLabel);
box.add(Box.createHorizontalGlue());
box.add(viewComboBox);
//Custom Renderer
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer (){
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
        if ( leaf ){
            if ( value instanceof MyLeafNode ){
                MyLeafNode node = (MyLeafNode)value;
                viewComboBox.removeAllItems();
                myLabel.setText(value.toString());
                for ( String item : node.items ){
                    viewComboBox.addItem(item);
                }
                viewComboBox.setSelectedItem(node.selected);
                return box;
            }
        }
        return this;
    }
};

//Custom Editor
final DefaultTreeCellEditor editor = new DefaultTreeCellEditor(tree, renderer){

    final ActionListener actionListener = new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            cancelCellEditing();
            tree.repaint();
        }
    };

    @Override
    public boolean isCellEditable(EventObject e){
        if ( e.getSource() instanceof JTree ){
            JTree tree = (JTree)e.getSource();
            if ( tree.getLastSelectedPathComponent() == null ){
                return false;
            }
            DefaultMutableTreeNode o = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
            return o.isLeaf();
        }
        return false;
    }

    @Override
    public void cancelCellEditing(){
        super.cancelCellEditing();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
        if ( node instanceof MyLeafNode) {
            String sel = editorComboBox.getSelectedItem().toString();
            MyLeafNode mln = (MyLeafNode)node;
            mln.selected = sel;
            editorComboBox.removeActionListener(actionListener);
            tree.repaint();
        }
    }

    @Override
    public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
        if ( leaf ){
            if ( tree.getLastSelectedPathComponent() instanceof MyLeafNode ){
                MyLeafNode o = (MyLeafNode)tree.getLastSelectedPathComponent();
                editorComboBox.removeAllItems();
                for ( String item : o.items ){
                    editorComboBox.addItem(item);
                }
                editorComboBox.setSelectedItem(o.selected);
                editorComboBox.addActionListener(actionListener);
            }
            return editorComboBox;

        }
        return super.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row);
    }

};
tree.setCellRenderer(renderer);
TreePath path = new TreePath(new TreeNode[]{root});
tree.expandPath(path);

for ( int i = 0; i < 2; i++ ){
    DefaultMutableTreeNode p = new DefaultMutableTreeNode("P" + i);
    model.insertNodeInto(p, root, i);
    for ( int j = 0; j < 2; j++ ){
        String[] items = {"Item 1", "Item 2", "Item 3", "Item 4"};
        MyLeafNode n = new MyLeafNode("N" + j, items);
        model.insertNodeInto(n, p, j);
    }
    path = new TreePath(new TreeNode[]{root, p});
    tree.expandPath(path);
}
tree.setCellEditor(editor);
tree.setEditable(true);

JScrollPane scroller = new JScrollPane(tree);
frame.add(scroller);
frame.pack();
frame.setVisible(true);

其中MyLeafNode是用于存储JComboBox特定数据的自定义类:

代码语言:javascript
运行
复制
public class MyLeafNode extends DefaultMutableTreeNode{

    private String[] items;
    private String selected;

    public MyLeafNode(String name, String...items){
        super(name);
        this.items = items;
        this.selected = items[0];
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38724298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档