2012-03-07 249 views
2

我正在显示一个自定义对象树,并且我已经设置了自定义的自定义CellTreeEditorCellTreeRenderer集合。JTree,始终显示“编辑模式”中的所有节点

现在我真正想要的是始终显示所有对象,如“编辑模式”。现在我的CellTreeRenderer.getTreeCellRendererComponent()CellTreeEditor.getTreeCellEditorComponent()实现几乎相同。这种作品,但我仍然需要点击一个节点来集中它,然后才能进行任何编辑。

有没有更明智的做法,也许就像说不应该使用渲染器,默认为我的CellTreeEditor

****** UPDATE ****

要clearify:我已经是这样看一棵树(是的,它也看起来像废话,但这是题外话):

JTree showing renderer and editor components

现在,我通过具有渲染器和从getTreeCell[Renderer|Editor]Component()返回相同的部件的编辑器实现这一点。

如果我单击渲染器提供的ComboBox上的向下箭头,它将闪烁轻微,因为它会打开下拉列表,但随后会被打断并由我的编辑器组件替换。这意味着我必须再次点击才能打开下拉菜单。这是我想要避免的行为。

+1

没有,你不想让你的编辑器在单元之间共享(讨厌的事情开始发生)相反,添加一个TreeCellListener来监听领导者的变化(aka:focused )选择路径,然后在该路径上明确开始编辑 – kleopatra 2012-03-07 15:23:54

+0

现在忘记闪烁(这可能是由于渲染器与编辑器略微错位),您基本上必须抓住启动编辑器的mouseEvent,检查它是否在里面该按钮,如果这样编程地显示下拉菜单,一旦编辑器被添加到层次结构 - 说起来容易做起来难,我知道:)如何显示一个sscce包括你的自定义渲染器/编辑器,所以我们试图让它在那里? – kleopatra 2012-03-08 14:24:06

回答

4

扩大我的评论:不,你不想让你的编辑器跨单元共享(讨厌的事情开始发生)相反,添加一个TreeCellListener监听领先(又名:聚焦)选择路径的变化,然后明确启动路径

final JXTree tree = new JXTree(); 
    tree.setEditable(true); 
    tree.expandAll(); 
    TreeSelectionListener l = new TreeSelectionListener() { 

     @Override 
     public void valueChanged(TreeSelectionEvent e) { 
      final TreePath path = e.getNewLeadSelectionPath(); 
      if (path != null) { 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         tree.startEditingAtPath(path); 
        } 
       }); 
      } 
     } 

    }; 
    tree.addTreeSelectionListener(l); 

,真正使工作的技巧上进行编辑平常:包装定制反应到的invokeLater,以确保树的内部更新完成

+0

原谅我可能愚蠢的问题。但是:当我点击一个节点时,我的节点会自动进入编辑模式,除此之外,我还没有做任何事情来设置自定义的CellEditor。这应该给什么额外的价值? – rogerkk 2012-03-08 08:29:42

+0

呃......你不必在节点上点击......?也许我错误地理解了你的问题,详细阐述了你究竟想要什么?(不是解决你在解决问题时可能遇到的问题:-) – kleopatra 2012-03-08 11:01:48

+0

我只是问,因为我假设我太了解你的答案了。它可能是非常好的,正是我所需要的。 8)无论如何,现在更新这个问题。希望这可以让它更清晰! – rogerkk 2012-03-08 13:44:14

相关问题