【问题标题】:Word Wrapping with JTree使用 JTree 自动换行
【发布时间】:2016-06-13 11:28:12
【问题描述】:

我想知道是否有任何方法可以在 JTrees 中使用自动换行。我在节点的文本中使用 HTML,我不确定这是否重要。

【问题讨论】:

  • 你能发布你的代码吗?
  • 不幸的是,我不知道我现在可以尝试什么。我曾想过用 JLabel 替换单元格渲染器,但这可以做任何事情,因为默认的已经是一个。
  • 这比我想象的要狡猾,+1,我也希望看到一个很好的解决方案。正确地获得(包装的!)行的高度,并且仍然为每个渲染器组件分配适当的宽度是很繁琐的。

标签: java swing jtree word-wrap


【解决方案1】:

好的,你可以尝试如下。

        JTree tree = new JTree();
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Animals");
        DefaultTreeModel model = new DefaultTreeModel(root);
        tree.setModel(model);
        root.add(new DefaultMutableTreeNode(new Animal("Dog","ACS")));
        root.add(new DefaultMutableTreeNode(new Animal("Cat","BCS")));
        root.add(new DefaultMutableTreeNode(new Animal("Lion","FCS")));
        root.add(new DefaultMutableTreeNode(new Animal("Tiger","<html>Hello World!<br>blahblahblah</html>")));

        DefaultTreeSelectionModel sModel = new DefaultTreeSelectionModel(); 
        sModel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.setSelectionModel(sModel);
        tree.addTreeSelectionListener(new TreeSelectionListener() {

            @Override
            public void valueChanged(TreeSelectionEvent selection) {
                DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)selection.getPath().getLastPathComponent();
                if(selectedNode.isLeaf()){
                    Animal animal = (Animal)selectedNode.getUserObject();
                }
            }
        });
        tree.setCellRenderer( new DefaultTreeCellRenderer(){

            @Override
            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
                    boolean leaf, int row, boolean hasFocus) {
                if(value != null ){
                    DefaultMutableTreeNode node =  (DefaultMutableTreeNode)value;
                    if(node.isLeaf()){
                        Animal animal = (Animal)((DefaultMutableTreeNode)value).getUserObject();

                        this.setText(animal.name);
                    }else {
                        return super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
                    }
                } 
                return this;
            }

        });

这给了我下面的输出。

希望对你有帮助。

对于自动包装内容,您可以使用 html

请参考安德鲁在此link的回答

【讨论】:

  • 谢谢,但这不是我在想的问题,我在想这个:imgur.com/UhC8AKg 看到文字被截断了
  • @utybo 你看到 Hello World! blahblahblah 这是一个 html。您可以使用 html 来包装长内容。
  • 我确实看到了,但是你明确地换行了,这不是我想做的。我想有一种方法来换行,例如 JTextArea 的 setLineWrap(boolean)
  • @utybo 如果你像这样使用 html,它会自动换行 "

    Hello World! asdasd asd asd asd as da das.das da sd asd asd asd asdasd asd asd, asd as blahblahblah

    "
  • 问题是它(只需 的简单方法)不起作用......所以我想我必须制作一个复杂的系统来检测标签的宽度(因为标签使用 getWidth 的宽度是不正确的)并将其应用于 html ...... imo 这对于类似的东西来说太复杂了。我想我会在我当前的项目中使用 JTrees 以外的其他东西,但我仍然想知道是否有一个干净、简单的解决方案
猜你喜欢
  • 1970-01-01
  • 2012-10-27
  • 2014-05-24
  • 2016-04-15
  • 2020-07-13
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多