Замените логическое представление проектов NetBeans на представление структуры

Контекст: Мы разрабатываем среду разработки Lua на основе RCP на платформе Netbeans. Мы внедрили систему сборки, которая позволяет пользователям легко включать / отключать файлы и добавлять псевдонимы для переименования файлов во время сборки. Мы считаем, что с точки зрения пользовательского интерфейса необходимо иметь флажки рядом с нашими пользовательскими узлами на логической вкладке проектов, чтобы упростить включение и отключение файлов.

Проблема: Мы хотим заменить BeanTreeView по умолчанию на представление Outline, потому что представление по умолчанию не учитывает 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();
            }


        }
    });

Заранее спасибо.

2 ответа

У меня это работает: (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();
}

Jirka

Решение заключается в задержке между 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);
        }
    });
Другие вопросы по тегам