当前位置: 首页 > 面试题库 >

简单快速的JTree单元编辑器

黄景胜
2023-03-14
问题内容

我有一个带有自定义TreeModel和自定义TreeRenderer的JTree。树模型包含一堆不同类型的对象。这些类型之一的显示方式与其他类型不同:显示的文本是对象的两个字段的串联。当我编辑单元格时,我想用编辑后的文本更新这些字段之一。到目前为止,我的工作情况还不错。

我的问题:当您在编辑时显示的文本是2个字段的完整串联值时,即使您实际上只是在编辑其中一个字段,也令人困惑。因此,当用户开始编辑时,我只想显示您正在编辑的一个字段的内容。

我尝试使用自定义的CellEditor来执行此操作,并且看到了它应该起作用的方式,并且在我的情况下,该方法似乎过大了。我只想在许多情况下更改显示的文本,所以自然地我想实现它,而不是整个TreeEditor的整个CellEditor。

是否有更快,更轻松的方法来执行此操作,还是必须使用自定义编辑器?

谢谢


问题答案:

自定义编辑器是没有办法的,它是最短的解决方案:-)另外,您将需要在 数据 领域中使用一些方法来解释编辑值,并通过自定义节点自行更新。

Fi(稍后会发表评论,我这台机器上的la脚的Firefox将我推向高墙)

/**
 * Basic code stolen from @trashgod at
* @see http://stackoverflow.com/a/11113648/230513
*/
public class TreeEditDemo extends JPanel {

    private JTree tree;
    private DefaultMutableTreeNode root;
    private DefaultTreeCellEditor editor;

    public TreeEditDemo() {
        super.setLayout(new GridLayout());
        root = new DefaultMutableTreeNode("Nodes");
        root.add(new MyResourceNode(new Resource("one", "first")));
        root.add(new MyResourceNode(new Resource("two", "first")));
        tree = new JTree(root);
        tree.setEditable(true);
        editor = new MyTreeCellEditor(tree,
            (DefaultTreeCellRenderer) tree.getCellRenderer());
        tree.setCellEditor(editor);
        this.add(new JScrollPane(tree));
    }

    private static class MyTreeCellEditor extends DefaultTreeCellEditor {

        public MyTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
            super(tree, renderer);
        }

        @Override
        public Component getTreeCellEditorComponent(JTree tree, Object value,
                boolean isSelected, boolean expanded, boolean leaf, int row) {
            if (value instanceof MyResourceNode) {
                value = ((MyResourceNode) value).getName();
            }
            return super.getTreeCellEditorComponent(tree, value, isSelected, expanded,
                    leaf, row);
        }

        @Override
        public boolean isCellEditable(EventObject e) {
            return super.isCellEditable(e)
                && ((TreeNode) lastPath.getLastPathComponent()).isLeaf();
        }
    }

    public static class MyResourceNode extends DefaultMutableTreeNode {

        /**
         * @param resource
         */
        public MyResourceNode(Resource resource) {
            super(resource);
        }

        @Override
        public void setUserObject(Object userObject) {
            if (userObject instanceof String) {
                setName((String) userObject);
            } else if (userObject instanceof Resource) {
                super.setUserObject(userObject);
            }    
        }

        public void setName(String name) {
            if (getUserObject() != null) {
                getUserObject().setName(name);
            }
        }

        public String getName() {
            if (getUserObject() != null) {
                return getUserObject().getName();
            }
            return null;
        }

        @Override
        public Resource getUserObject() {
            return (Resource) super.getUserObject();
        }


    }
    private static class Resource {

        String name;
        private String category;

        public Resource(String name, String category) {
            this.name = name;
            this.category = category;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
        @Override
        public String toString() {
            // BEWARE: don't do this in production code!
            return name + " (" + category + ")";
        }
    }

    private void display() {
        JFrame f = new JFrame("TreeEditorDemo");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TreeEditDemo().display();
            }
        });
    }
}


 类似资料:
  • 问题内容: 我创建了一个新文件。所谓 然后在那里我做: 我想在另一个class()中使用它, 很好,但是当我深入研究错误时。 问题答案: 您不能只是拥有一个init。该变量必须在类顶层声明。 使用单例的示例: 当需要在另一个类中使用单例时,只需在另一个类中执行此操作: 按照Martin R和Caleb的评论进行更新: 我已将初始化程序设为私有。它在其他Swift文件中阻止的初始化,从而只能通过使用

  • 本文向大家介绍简单实现winform编辑器,包括了简单实现winform编辑器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了winform编辑器的具体实现代码,供大家参考,具体内容如下 就是写了一个挺简单的在winform里进行填写文本,里面用到的ADO.NET来链接数据库,在新建文本的时候需要写入.txt后缀名,打开或者是删除的时候需要先点击一下文本名。 写的不足请见谅! 以上就

  • 项目中需要用到一个编辑器,现在用的是wangeditor,一是不维护了,二是感觉有点太重量级了,我要做的功能就是简单的文本编辑功能,就是用来写“诊断报告”的,有没有比较好用的,轻量级的这种编辑器?

  • 问题内容: 我正在尝试用Java编写程序来管理我的Bookie帐户。我是java的新手,所以我认为我会选择一些简单的方法来了解事情的原理。我决定使用表格视图并使各个单元格可编辑。我一直在关注本教程http://java- buddy.blogspot.co.uk/2012/04/javafx-2-editable-tableview.html 。它详细说明了如何使用Java代码执行此操作,并将其复

  • 问题内容: 我正在尝试使用UICollectionView创建一个网格,用户可以将其设置为x单元x y单元(在文本框中输入),同时仍在屏幕上占据相同的宽度。 我已经能够创建一个包含正确数量的单元格的网格视图,但是这些视图的布局不正确,即,按5输入7将得到35个单元格,但不能按5输入7个单元格进行布局。这是我到目前为止的代码。 MyCollectionViewCell.swift导入UIKit Cr

  • 12.3 简单的屏幕编辑程序 下面是一个简单的屏幕编辑的C语言程序,它不仅涉及到键盘处理、光标定位、屏幕输出、字符颜色等,而且还运用了C语言和汇编语言的混合编程方法。若读者能把它改写成相同功能的汇编语言程序,那么,可以说,你已基本掌握了中断的使用方法,也对计算机输入输出的工作方式有了更进一步的认识。 该程序的功能: ◆ 可用移动光标键↑、↓、←和→移动光标1行或1列,也可用TAB/Shift+TA