2016-06-08 73 views
0

模擬右擊事件我有一個Tab,我想以編程方式觸發右擊事件,彈出我的ContextMenu,選項卡上的JavaFX如何在標籤

Tab tab = new Tab("Some tab that has no graphic and doesnt need graphic"); 
tab.setContextMenu(new ContextMenu(new MenuItem("go"))); 
//add it to a tabPane. 
//now when i want to trigger a right click i do this 
Event rightClick = new MouseEvent(MouseEvent.MOUSE_CLICKED, 0, 0, 0, 0, MouseButton.SECONDARY, 
       1, false, false, false, false, false, false, false, false, true, false, null); 
MouseEvent.fireEvent(tab, rightClick);//but it doesnt work why?? 

設置我甚至已經改變了代碼上面的代碼工作的任何普通節點上這樣

Event rightClick = new MouseEvent(MouseEvent.MOUSE_CLICKED, 0, 0, 0, 0, MouseButton.SECONDARY, 
       1, false, false, false, false, false, false, true, false, true, false, null); //still no 

,只是Tab

我需要一個javafx的方式

+1

impersonate = simulate? – shmosel

+0

@shmosel謝謝,是的,我想要觸發右鍵點擊時,我想。 – Elltz

+0

只是爲了手動顯示ContextMenu的目的? – Peter

回答

3

它不起作用,因爲Tab不支持鼠標事件。 Tab類不是Node子類,即它不代表您在選項卡窗格標題中看到的實際選項卡UI:它代表選項卡的模型。 (它封裝了文本,不管它是否被選中等)。事件支持是類似onCloseRequested,onClosed,onSelectionChanged。請參閱documentation

要觸發鼠標事件,您需要在選項卡表示的實際UI上觸發它。你只能通過CSS查找來獲得這個,這有點破解,但它可以工作。

我實際上建議在上下文菜單上調用show,而不是觸發事件,因爲它更符合語義地表示要執行的操作。據我所知,你仍然需要查找節點,因爲你需要在屏幕上找到它的位置,但你可以做contextMenu.show(tab.getTabPane().getScene().getWindow());,上下文菜單會出現某處。但它是更好地得到參考節點:

import javafx.animation.PauseTransition; 
import javafx.application.Application; 
import javafx.geometry.Side; 
import javafx.scene.Node; 
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.stage.Stage; 
import javafx.util.Duration; 

public class ShowTabContextMenu extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TabPane tabPane = new TabPane(); 
     Tab tab = new Tab("Tab"); 
     tab.setId("myTab"); 

     tabPane.getTabs().add(tab); 

     ContextMenu contextMenu = new ContextMenu(); 
     contextMenu.getItems().addAll(new MenuItem("Choice 1"), new MenuItem("Choice 2")); 
     tab.setContextMenu(contextMenu); 

     Scene scene = new Scene(tabPane, 400, 400); 
     PauseTransition pause = new PauseTransition(Duration.seconds(2)); 

     pause.setOnFinished(e -> { 
      Node theTab = tabPane.lookup("#myTab"); 
      contextMenu.show(theTab, Side.RIGHT, 0, 0); 
     }); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 

     pause.play(); 
    } 

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

如果你真的想要模擬一個事件,你應該模擬ContextMenuEvent,而不是鼠標事件:

pause.setOnFinished(e -> { 
     Node theTab = tabPane.lookup("#myTab"); 
     // contextMenu.show(theTab, Side.RIGHT, 0, 0); 
     Bounds tabBounds = theTab.getBoundsInLocal(); 
     double centerX = tabBounds.getMinX() + tabBounds.getWidth()/2; 
     double centerY = tabBounds.getMinY()+tabBounds.getHeight()/2; 
     Point2D location = theTab.localToScreen(centerX, centerY); 
     double x = location.getX(); 
     double y = location.getY(); 
     Event event = new ContextMenuEvent(ContextMenuEvent.CONTEXT_MENU_REQUESTED, centerX, centerY, x, y, false, new PickResult(theTab, x, y)); 
     Event.fireEvent(theTab, event); 
    }); 

但只是似乎是錯誤的對我來說:沒有發生實際事件,你只需要顯示上下文菜單。