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);
});
}
ありがとう、ホセ! – progonkpa