Замените логическое представление проектов 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);
}
});