Java 将Netbeans项目逻辑视图替换为大纲视图

Java 将Netbeans项目逻辑视图替换为大纲视图,java,swing,netbeans-platform,netbeans-plugins,outline-view,Java,Swing,Netbeans Platform,Netbeans Plugins,Outline View,上下文:我们正在设计一个基于Netbeans平台RCP的Lua IDE。我们已经实现了一个构建系统,允许用户在构建时轻松启用/禁用文件,并添加别名来重命名文件。我们认为,从UI的角度来看,有必要在“项目逻辑”选项卡中的自定义节点旁边设置复选框,以简化启用和禁用文件的过程 问题:我们想用大纲视图替换默认BeanTreeView,因为默认视图不支持查找中的CheckableNode。我们不确定这样做的最佳方式,但我们设计的解决方案似乎是错误的。组件无法正确调整大小,并且节点不会像在本机BeanTre

上下文:我们正在设计一个基于Netbeans平台RCP的Lua IDE。我们已经实现了一个构建系统,允许用户在构建时轻松启用/禁用文件,并添加别名来重命名文件。我们认为,从UI的角度来看,有必要在“项目逻辑”选项卡中的自定义节点旁边设置复选框,以简化启用和禁用文件的过程

问题:我们想用大纲视图替换默认BeanTreeView,因为默认视图不支持查找中的CheckableNode。我们不确定这样做的最佳方式,但我们设计的解决方案似乎是错误的。组件无法正确调整大小,并且节点不会像在本机BeanTreeView中那样在启动时自动展开

实现细节:我们创建了一个FilterNode来代理DataObject节点委托。我们还将自己的属性集添加到查找中,并添加了一个实现CheckableNode的类(因此大纲视图左侧的复选框)

这就是它现在的样子,这正是我们想要的样子:

下面是我们用来安装它的代码:

final String PROJECT_LOGICAL_TAB_ID = "projectTabLogical_tc";
    WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
        @Override
        public void run() {
            TopComponent findTopComponent = WindowManager.getDefault().findTopComponent(PROJECT_LOGICAL_TAB_ID);
            if (findTopComponent != null) {
                Component[] components = findTopComponent.getComponents();
                for (Component component : components) {
                    component.setVisible(false);          
                }
                OutlineView myView2 = new OutlineView("Filename");
                Outline outline2 = myView2.getOutline();
                outline2.setRootVisible(false);
                outline2.setTableHeader(null);         
                findTopComponent.add(myView2, BorderLayout.CENTER);
                findTopComponent.revalidate();
                findTopComponent.validate();
                findTopComponent.repaint();
            }


        }
    });
提前感谢。

它适合我:(win7,Java7x64,NB开发(20121214))


Jirka

解决方案在于invokeWhenuirady和转换之间的延迟

        WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
        @Override
        public void run() {                
            RequestProcessor.getDefault().post(new Runnable() {
                @Override
                public void run() {
                    //We must do this in the awt thread
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            TopComponent findTopComponent = WindowManager.getDefault().findTopComponent(PROJECT_LOGICAL_TAB_ID); // TODO add your handling code here:
                            findTopComponent.setVisible(false);
                            findTopComponent.removeAll();
                            findTopComponent.setLayout(new BorderLayout());
                            OutlineView myView2 = new OutlineView("Filename");                      
                            Outline outline2 = myView2.getOutline();
                            outline2.setRootVisible(false);
                            outline2.setTableHeader(null);
                            findTopComponent.add(myView2, BorderLayout.CENTER);
                            findTopComponent.setVisible(true);
                            findTopComponent.open();
                            findTopComponent.requestActive();
                        }
                    });
                }
                //This delay is important!
            }, 1000);
        }
    });

我只在独立上下文中使用了
Outline
,但我希望
TopComponent
的布局管理器会影响
DefaultOutlineCellRenderer
。您的
OutlineModel
是否有
RowModel
?您在TopComponent中有BorderLayout吗?@trashgod:是的,我们在另一个顶级组件中的独立上下文中也使用Outline,并且它在没有RowModel的情况下可以很好地扩展。@user1722245:是的,顶级组件有一个边框布局(至少gui快照说有)。我们还尝试设置新的边界布局,但仍然有相同的问题。谢谢!这使我们找到了问题的解决办法。我仍然不确定为什么这会解决问题,但在实际转换中添加invokeWhenuiredy延迟可以解决问题。知道这是为什么吗?当逻辑视图恢复以前的节点状态(即选择/折叠/展开)时,如果找不到bean树视图,它似乎会恢复bean树视图。这就是我们需要延期的原因。不幸的是,它并不总是在指定的时间工作,因此一个更干净的解决方案(基于属性更改?)将非常受欢迎。
        WindowManager.getDefault().invokeWhenUIReady(new Runnable() {
        @Override
        public void run() {                
            RequestProcessor.getDefault().post(new Runnable() {
                @Override
                public void run() {
                    //We must do this in the awt thread
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            TopComponent findTopComponent = WindowManager.getDefault().findTopComponent(PROJECT_LOGICAL_TAB_ID); // TODO add your handling code here:
                            findTopComponent.setVisible(false);
                            findTopComponent.removeAll();
                            findTopComponent.setLayout(new BorderLayout());
                            OutlineView myView2 = new OutlineView("Filename");                      
                            Outline outline2 = myView2.getOutline();
                            outline2.setRootVisible(false);
                            outline2.setTableHeader(null);
                            findTopComponent.add(myView2, BorderLayout.CENTER);
                            findTopComponent.setVisible(true);
                            findTopComponent.open();
                            findTopComponent.requestActive();
                        }
                    });
                }
                //This delay is important!
            }, 1000);
        }
    });