簡體   English   中英

JavaFX:TabPane上下文菜單,取決於所選的選項卡

[英]JavaFX: TabPane context menu, depending on selected tab

我想要一個帶有多個選項卡的TabPane,每個選項卡都具有不同的上下文菜單。

在TabPane上設置ContextMenu顯然會導致使用相同的ContextMenu,而與選定的選項卡無關。 我嘗試在不同的選項卡上設置不同的ContextMenus,但這有兩個不利影響:

  1. 僅在右鍵單擊選項卡標題時才打開上下文菜單(而在TabPane上進行設置則允許右鍵單擊選項卡內的任何位置)。 我希望用戶能夠從選項卡內的任何地方訪問上下文菜單,而不僅僅是標題。

  2. 右鍵單擊一個選項卡標題,同時選擇另一個選項卡標題,仍會打開單擊的選項卡的上下文菜單-我希望上下文菜單取決於當前選擇的選項卡。

我唯一想到的方法是捕獲onContextMenuRequested,查看當前選擇了哪個選項卡,並將各種MenuItems設置為可見/不可見,但這似乎很愚蠢。 有更好的方法嗎?

編輯:Calrification-選項卡上的內容是窗格(VBox,GridPane等),因此直接在內容上設置ContextMenu是可惜的。

我可以看到兩種解決方案。 一種是在選項卡窗格上設置單個上下文菜單。 在選定的選項卡上注冊一個偵聽器,然后在選擇更改時重新填充上下文菜單。

另一種解決方案是在選項卡的內容上設置上下文菜單。 請注意,可以通過注冊contextMenuRequested事件的處理程序來在任何節點上設置上下文菜單,並顯示上下文菜單。 您可以在選項卡上設置相同的上下文菜單。

此示例演示了兩種技術:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class TabPanesWithContextMenu extends Application {

    @Override
    public void start(Stage primaryStage) {
        TabPane tabPane1 = new TabPane();
        ContextMenu contextMenu = new ContextMenu();
        tabPane1.setContextMenu(contextMenu);

        List<MenuItem> tab1Items = new ArrayList<>();
        tab1Items.add(new MenuItem("Choice 1"));
        tab1Items.add(new MenuItem("Choice 2"));

        List<MenuItem> tab2Items = new ArrayList<>();
        tab2Items.add(new MenuItem("Choice 3"));
        tab2Items.add(new MenuItem("Choice 4"));

        Tab tab1 = new Tab("Tab 1");
        tab1.setContent(new Pane());
        Tab tab2 = new Tab("Tab 2");
        tab2.setContent(new Pane());
        tabPane1.getTabs().addAll(tab1, tab2);

        Map<Tab, List<MenuItem>> itemsByTab = new HashMap<>();
        itemsByTab.put(tab1, tab1Items);
        itemsByTab.put(tab2, tab2Items);

        tabPane1.getSelectionModel().selectedItemProperty().addListener((obs, oldTab, newTab) -> 
           contextMenu.getItems().setAll(itemsByTab.get(newTab)) );

        contextMenu.getItems().addAll(tab1Items);

        TabPane tabPane2 = new TabPane();

        Tab tab3 =  createTabWithContextMenu("Tab 3", new MenuItem("Choice 5"), new MenuItem("Choice 6"));
        Tab tab4 =  createTabWithContextMenu("Tab 4", new MenuItem("Choice 7"), new MenuItem("Choice 8"));

        tabPane2.getTabs().addAll(tab3, tab4);

        HBox root = new HBox(10, tabPane1, tabPane2);

        primaryStage.setScene(new Scene(root, 600, 600));
        primaryStage.show();
    }

    private Tab createTabWithContextMenu(String title, MenuItem... items) {
        Tab tab = new Tab(title);
        ContextMenu contextMenu = new ContextMenu(items);
        tab.setContextMenu(contextMenu);

        Pane content = new Pane();
        content.setOnContextMenuRequested(e -> 
            contextMenu.show(content, e.getScreenX(), e.getScreenY()));
        tab.setContent(content);

        return tab ;
    }

    public static void main(String[] args) {
        launch(args);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM