2016-04-15 37 views
2

已經有一個相關的question已經回答,但自那時以來使用註釋發生了很大變化。使用註釋在Netbeans平臺上創建窗口組

我正在使用註釋註冊TopComponents。例如:

@TopComponent.Registration(mode = "explorer", openAtStartup = false, 
     roles = "Test Role") 

後來我試圖打開組這樣的,作爲一個測試:

WindowManager.getDefault().invokeWhenUIReady(() -> { 
     WindowManager.getDefault().getRegistry().getOpened().stream() 
       .forEach((tc) -> { 
        tc.close(); 
       }); 
     TopComponentGroup group 
       = WindowManager.getDefault() 
       .findTopComponentGroup("Test Role"); 
     if (group != null) { 
      group.open(); 
     } 
    }); 

所有組件都關閉,但沒有打開。它不起作用,所以顯然有些管道缺失。

這仍然是正確的做法嗎?

有沒有這個地方的工作示例?

+0

至少通過RELEASE80,沒有內置的方法來註冊帶有註釋的'TopComponentGroup'。有人自己做[註釋處理器](https://sourceforge.net/projects/topcomponentgroupregistration/)來做,儘管你可以嘗試使用它。 – heenenee

+0

看起來很有趣。嘗試一下,試圖找出模塊參數的有效值。令人遺憾的是,文件不存在。 – javydreamercsw

+0

我想通過閱讀Windows API後應該放在那裏,但它似乎並不奏效。 :( – javydreamercsw

回答

1

這裏是我是如何能夠使之成爲在這個問題上任何人都磕磕絆絆工作:

我創建了一個類,並註冊爲在此基礎上code服務:

/** 
* Based on code from: http://www.smartcode.ch/netbeans-hide-show-topcomponent/ 
* 
* @author Javier A. Ortiz Bultrón [email protected] 
*/ 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 
import org.openide.util.Lookup; 
import org.openide.util.lookup.ServiceProvider; 
import org.openide.windows.Mode; 
import org.openide.windows.TopComponent; 
import org.openide.windows.WindowManager; 

@ServiceProvider(service = ViewManager.class) 
public class ViewManager { 

    private final Map<TopComponent, Mode> hiddenComponents; 

    public ViewManager() { 
     hiddenComponents = new HashMap<>(); 
    } 

    public synchronized void showTopComponent(Class<? extends TopComponent> topComponentClass) { 

     for (Map.Entry<TopComponent, Mode> hiddenComponentEntry : hiddenComponents.entrySet()) { 
      TopComponent hiddenComponent = hiddenComponentEntry.getKey(); 

      if (hiddenComponent.getClass().equals(topComponentClass)) { 
       Mode mode = hiddenComponentEntry.getValue(); 
       WindowManager.getDefault().findMode(mode.getName()).dockInto(hiddenComponent); 
       hiddenComponent.open(); 
       hiddenComponents.remove(hiddenComponent); 
       break; 
      } 

     } 
    } 

    public synchronized void hideTopComponent(Class<? extends TopComponent> topComponentClass) { 

     Set<TopComponent> shownTopComponents = WindowManager.getDefault().getRegistry().getOpened(); 

     for (TopComponent shownTopComponent : shownTopComponents) { 
      if (shownTopComponent.getClass().equals(topComponentClass)) { 
       Mode mode = WindowManager.getDefault().findMode(shownTopComponent); 

       hiddenComponents.put(shownTopComponent, mode); 
       shownTopComponent.close(); 
      } 
     } 
    } 

    public synchronized void showAll() { 
     for (TopComponent tc : hiddenComponents.keySet()) { 
      showTopComponent(tc.getClass()); 
     } 
    } 

    /** 
    * Load a screen role. 
    * 
    * @param role Role to load. 
    */ 
    public static void loadRole(String role) { 
     //Open all components 
     Lookup.getDefault().lookup(ViewManager.class).showAll(); 
     //Change role (this closes the ones not in this role) 
     WindowManager.getDefault().setRole(role); 
    } 
} 

然後在一個模塊安裝器我這樣做:

@Override 
    public void restored() { 
     WindowManager.getDefault().invokeWhenUIReady(() -> { 
      /** 
      * All windows start opened. Populated the ViewManager. It is 
      * important to configure all TopComponents with: 
      * persistenceType = TopComponent.PERSISTENCE_NEVER or TopComponent.PERSISTENCE_ONLY_OPENED 
      * and openAtStartup = true 
      */ 
      ViewManager manager = Lookup.getDefault().lookup(ViewManager.class); 
      WindowManager.getDefault().getRegistry().getOpened().stream() 
        .forEach((tc) -> { 
         manager.hideTopComponent(tc.getClass()); 
        }); 
      manager.loadRole(Tool.LOBBY); 
     }); 
    } 

訣竅,如記錄在安裝程序代碼,是紀念所有模塊在打開啓動和正確的持久性TY PE。

這將打開應用程序啓動時的所有窗口,隱藏它們(同時在ViewManager上註冊它們),然後打開指定的角色。

角色,如記錄here,請執行下列操作:

此方法的默認實現執行以下操作:

  1. 隱藏主窗口。
  2. 保存當前窗口布局的當前 角色。
  3. 從給定角色加載新的窗口布局。
  4. 顯示主窗口。

另一種選擇是重寫WindowManager本身來完成所有這些工作,但是我發現它太侵入且危險,因爲某些方法受到保護,因此無法包裝WindowsManagerImpl(默認值)。也不可能擴展WindowsManagerImpl,因爲它的包是私有的。

相關問題