2

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

问题:我们想用 Outline 视图替换默认的 BeanTreeView,因为默认视图不支持查找中的 CheckableNode。我们不确定执行此操作的最佳方法,但我们设计的解决方案似乎是错误的方法。组件没有正确调整大小,并且节点不会像在原生 BeanTreeView 中那样在启动时自动展开。

实现细节:我们创建了一个代理 DataObject 节点委托的 FilterNode。我们还在查找中添加了我们自己的属性集,并添加了一个实现 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();
            }


        }
    });

提前致谢。

4

2 回答 2

1

它对我有用:(win7,Java 7 x64,NB dev(20121214))

public void jbuttonActionPerformance(ActionEvent ev){

    TopComponent findTopComponent = WindowManager.getDefault().findTopComponent("OutlineTopComponent"); // TODO add your handling code here:
   findTopComponent.setVisible(false);
   findTopComponent.removeAll();
   findTopComponent.setLayout(new BorderLayout());

    OutlineView myView2 = new OutlineView("Filename");
    Outline outline2 = myView2.getOutline();
    findTopComponent.add(myView2, BorderLayout.CENTER);

    findTopComponent.setVisible(true);
    findTopComponent.open();findTopComponent.requestActive();
}

吉尔卡

于 2012-12-18T19:11:40.940 回答
1

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

        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);
        }
    });
于 2012-12-19T03:46:31.113 回答