はNavigationDrawer
基本的に項目のリストを含むポップアップで、通常はこれらの項目のそれぞれで を選択できますView
。
引き出しからのみビューにアクセスできる場合は、選択されたアイテムが常にアクティブなビューに関連しているため、問題はありません。
戻るボタンなど、他の方法でビューにアクセスすると、問題が発生します。
デフォルトでは、ドロワー リストはアクティブなビューを追跡して関連アイテムを自動選択しません。後で、既に選択されているアイテムを選択しようとすると、リスナーはビューの切り替えを開始しません。
これはコントロールによって内部的に行うことができますが (今後のバージョンではおそらくそれを管理します)、簡単に実現できます。
メインクラスにリスナーを追加するだけviewProperty()
で、ビューが変更されるたびに、ドロワーで選択されたアイテムが更新されます。これにより の変更がトリガーされるためnavigationDrawer.selectedItemProperty()
、選択を更新する前に、リスナーを削除して再度追加する必要があります。
public static final String PRIMARY_VIEW = HOME_VIEW;
public static final String SECONDARY_VIEW = "Secondary View";
public static final String MENU_LAYER = "Side Menu";
private Item primaryItem;
private Item secondaryItem;
private final ChangeListener listener = (obs, oldItem, newItem) -> {
hideLayer(MENU_LAYER);
switchView(newItem.equals(primaryItem) ? PRIMARY_VIEW : SECONDARY_VIEW);
};
@Override
public void init() {
addViewFactory(PRIMARY_VIEW, () -> new PrimaryView(PRIMARY_VIEW).getView());
addViewFactory(SECONDARY_VIEW, () -> new SecondaryView(SECONDARY_VIEW).getView());
NavigationDrawer drawer = new NavigationDrawer();
primaryItem = new Item("Primary", MaterialDesignIcon.HOME.graphic());
secondaryItem = new Item("Secondary", MaterialDesignIcon.DASHBOARD.graphic());
drawer.getItems().addAll(primaryItem, secondaryItem);
primaryItem.setSelected(true);
drawer.selectedItemProperty().addListener(listener);
addLayerFactory(MENU_LAYER, () -> new SidePopupView(drawer));
viewProperty().addListener((obs, ov, nv) -> {
drawer.selectedItemProperty().removeListener(listener);
if (nv.getName().equals(PRIMARY_VIEW)) {
primaryItem.setSelected(true);
secondaryItem.setSelected(false);
drawer.setSelectedItem(primaryItem);
} else {
primaryItem.setSelected(false);
secondaryItem.setSelected(true);
drawer.setSelectedItem(secondaryItem);
}
drawer.selectedItemProperty().addListener(listener);
});
}