2013-05-28 1 views
4

javafx UI를 작성 중이며 클릭 한 MenuItem에 대한 eventHandler에서 contextMenu의 소유자 Node를 가져 오려고합니다.Javafx 2.0 - EventHandler에서 ContextMenu 부모 노드 가져 오기

내 코드 :

TabPane tabPane = new TabPane(); 
Tab tab1 = new Tab(); 
Tab tab2 = new Tab(); 

tabPane.getTabs().addAll(tab1,tab2); 

ContextMenu contextMenu = new ContextMenu(); 
MenuItem menuItem = new MenuItem("Do Some Action"); 

menuItem.setOnAction(new EventHandler<ActionEvent>(){ 
    @override 
    public void handle(ActionEvent e){ 
     // Get the tab which was clicked on and do stuffs with it 
    } 
}); 

contextMenu.getItems().add(menuItem); 

for(Tab tab: tabPane.getTabs()){ 
    tab.setContextMenu(contextMenu); 
} 

내가 뭘하고 싶은 것은이 contextMenu를가 선택되어 있었다 탭에 대한 참조를 얻을 수있다. 거기에서

ContextMenu menu = ((ContextMenu)((MenuItem)e.getSource()).getParentPopup()); 

내 생각 :

나는 다음과 같은 MenuItem과 이벤트 핸들러에 대한 내부 핸들 (의 ActionEvent 전자)의 코드 방식으로의 MenuItem의의 ContextMenu를 것으로 보인다 무엇에 대한 참조를 얻을 수 있었다 메뉴에서 ContextMenu의 .getOwnerNode() 메소드를 사용하고 나서 탭에 대한 참조를 가졌지 만, 실행할 때 내가 이해할 수없는 항목에 대한 참조를 얻습니다.

.getOwnerNode()에 의해 반환 된 개체의 toString() 메서드는 "TabPaneSkin $ TabHeaderSkin $ 3 @ 14f59cef"를 반환하며 그 의미를 알 수 없습니다.

노드에 올바르게 도달하거나 완전히 다른 접근 방식이 더 잘 작동 할 때까지 체인을 따라 올라가는 방식으로 접근하고 있습니까?

ContextMenu의 기능이 있어야하는데 MenuItem을 클릭하면 ContextMenu가 선택된 탭에 대한 참조가 있어야만 멋지게 처리 할 수 ​​있습니다.

답변

4
  1. 각 탭에 대해 ContextMenu를 만듭니다.
  2. 각 탭을 마지막으로 만듭니다.
  3. 상황에 맞는 메뉴의 메뉴 항목 이벤트 처리기에서 최종 탭을 직접 참조하십시오.

    final Tab tab = new Tab("xyzzy"); 
    ContextMenu contextMenu = new ContextMenu(); 
    MenuItem menuItem = new MenuItem("Do Some Action"); 
    menuItem.setOnAction(new EventHandler<ActionEvent>(){ 
        @Override public void handle(ActionEvent e){ 
        tab.setText("Activated by User"); 
        } 
    }); 
    

    사용자가 바로 "클릭 횟수"메뉴를 탭 헤더를 클릭하고 선택 때마다, 관련 탭의 내용의 카운트로 업데이트됩니다 : 여기

는 코드입니다 그 탭에 대해 지금까지 계산 된 핥기의 수. 여기

clickcounter

가 실행 샘플입니다 : 익명의 내부 클래스이 방법을 사용하는 다른 방법

import javafx.application.*; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

public class TabContext extends Application { 
    @Override public void start(Stage stage) { 
    TabPane tabPane = new TabPane(); 

    tabPane.getTabs().addAll(
     createTab("xyzzy", "aliceblue"), 
     createTab("frobozz", "blanchedalmond") 
    ); 

    stage.setScene(new Scene(tabPane)); 
    stage.show(); 
    } 

    private Tab createTab(String tabName, String webColor) { 
    final Label content = new Label("0"); 
    content.setAlignment(Pos.CENTER); 
    content.setPrefSize(200, 100); 
    content.setStyle("-fx-font-size: 30px; -fx-background-color: " + webColor + ";"); 

    final Tab tab = new Tab(tabName); 
    tab.setContent(content); 

    ContextMenu contextMenu = new ContextMenu(); 

    MenuItem menuItem = new MenuItem("Count Click"); 
    menuItem.setOnAction(new EventHandler<ActionEvent>(){ 
     @Override public void handle(ActionEvent e){ 
     content.setText(
      "" + (Integer.parseInt(content.getText()) + 1) 
     ); 
     } 
    }); 

    contextMenu.getItems().add(menuItem); 

    tab.setContextMenu(contextMenu); 

    return tab; 
    } 

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

, 당신은 핸들러가있는 탭을 포함하는 생성자와 함께 이벤트 핸들러 서브 클래스를 만들 수 있습니다 붙여진.

class TabContextMenuHandler implements EventHandler<ActionEvent> { 
    private final Tab tab; 

    TabContextMenuHandler(Tab tab) { 
    this.tab = tab; 
    } 

    @Override public void handle(ActionEvent event) { 
    tab.setText("Activated by User"); 
    } 
} 
+0

빠른 응답과 멋진 솔루션에 감사드립니다. – mcdonasm