2016-04-15 13 views
2

関連するquestionがすでに回答されていますが、それ以降は注釈を使用して変更されています。注釈付きNetbeansプラットフォームでのウィンドウグループの作成

私はTopComponentにアノテーションを登録しています。たとえば:

@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を拡張することも不可能です。これはパッケージがプライベートであるためです。

関連する問題