2017-12-01 11 views
0

메뉴와 관련된 몇 가지 JavaFX 클래스를 살펴 보았지만 원하는 것을 찾을 수 없었습니다. MenuBar처럼 작동하는 것을 구현하고 싶습니다. 다만, 클릭 할 때가 아니라 마우스를 올리면 메뉴가 열리기를 원합니다. 혼자서 처음부터 무언가를 만들 수는 있지만, 이미 비슷한 것을 할 수있는 무언가가 있다면 시간 낭비 일 것입니다. 아무도 그걸 어떻게 알 수 있습니까?JavaFX에서 완전히 호버를 트리거하는 메뉴는 무엇입니까?

+0

를 사용하여 사용자 정의'MenuBar'와 그 청취자를 변경 : 당신은 내가 lookup("HBox") 진실을 사용하는 알지 못했다 궁금 경우 또한

내 첫 번째 시도는 나에게 현재의 정보를 준 System.out.println(menuBar.lookupAll("*"));했다입니까? – user1803551

+0

['ControlsFX'] (http://fxexperience.com/controlsfx/) – Sedrick

답변

0

난 당신이 클래스 javafx.scene.control.ContextMenu 및 방법을 찾고 있다고 생각 show(Node anchor, double screenX, double screenY)

+0

하지만 메인 윈도우의 장면 그래프에 컨텍스트 메뉴가 필요합니다. – Jai

1

글쎄 그것은 당신이 lookup()을 사용하는 경우 그것을 만들 수 있습니다. 메뉴가 들어있는 컨테이너를 쉽게 가져 와서 setOnMouseEntered() 또는 setOnMouseExited()을 적용하여 각 메뉴에서 마우스 이벤트를 포착 할 수 있습니다.

import javafx.application.Application; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     BorderPane mainPane = new BorderPane(); 

     MenuBar menuBar = new MenuBar(); 

     Menu editMenu = new Menu("File"); 
     MenuItem fileMenuItem1 = new MenuItem("Item 1"); 
     MenuItem fileMenuItem2 = new MenuItem("Item 2"); 
     MenuItem fileMenuItem3 = new MenuItem("Item 3"); 
     editMenu.getItems().addAll(fileMenuItem1, fileMenuItem2, fileMenuItem3); 

     Menu fileMenu = new Menu("Edit"); 
     MenuItem fileMenu1 = new MenuItem("Item 1"); 
     MenuItem fileMenu2 = new MenuItem("Item 2"); 
     MenuItem fileMenu3 = new MenuItem("Item 3"); 
     fileMenu.getItems().addAll(fileMenu1, fileMenu2, fileMenu3); 

     menuBar.getMenus().addAll(editMenu, fileMenu); 

     mainPane.setTop(menuBar); 

     Scene scene = new Scene(mainPane, 300, 300); 
     Stage stage = new Stage(); 
     stage.setScene(scene); 
     stage.show(); 

     // Find menubar HBox holding the menus 
     HBox container = (HBox) menuBar.lookup("HBox"); 

     for(int i = 0 ; i < container.getChildren().size() ; i++) { 
      Node parentNode = container.getChildren().get(i); 
      Menu menu = menuBar.getMenus().get(i); 

      parentNode.setOnMouseMoved(e->{ 
       menu.show(); 
      }); 
     } 
    } 

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

내가 대신 setOnMouseEnteredsetOnMouseMoved을 사용하는 이유 당신은 궁금 할 것이다 : 여기

은 예입니다. 왜냐하면 setOnMouseEntered은 메뉴 사이에서 마우스를 움직이는 동안 이상한 행동을하고 setOnMouseMoved의 사용법이 수정되기 때문입니다.

[[email protected][styleClass=menu-bar], [email protected][styleClass=container], MenuBarSkin$MenuBarButton[id=null, styleClass=menu-button menu]'File', [email protected][styleClass=label]'File', Text[text="File", x=0.0, y=0.0, alignment=LEFT, origin=BASELINE, boundsType=LOGICAL_VERTICAL_CENTER, font=Font[name=System Regular, family=System, style=Regular, size=12.0], fontSmoothingType=LCD, fill=0x333333ff], [email protected][styleClass=arrow-button], [email protected][styleClass=arrow], MenuBarSkin$MenuBarButton[id=null, styleClass=menu-button menu]'Edit', [email protected][styleClass=label]'Edit', Text[text="Edit", x=0.0, y=0.0, alignment=LEFT, origin=BASELINE, boundsType=LOGICAL_VERTICAL_CENTER, font=Font[name=System Regular, family=System, style=Regular, size=12.0], fontSmoothingType=LCD, fill=0x333333ff], [email protected][styleClass=arrow-button], [email protected][styleClass=arrow]]