2012-04-25 35 views
10

Tôi đang tạo một MenuBar và tôi không có chức năng nhấn Menu như: "Tệp" và sau đó thực hiện một hành động. Chẳng hạn như mở một fxml khác hoặc một ví dụ trong đó một số đầu ra được viết.JavaFX 2.0 Kích hoạt một Menu như một MenuItem

Tôi muốn chức năng của MenuItem (nằm "Giới thiệu") trong một "Menu như" Tệp ".

package model; 

import static java.lang.System.out; 

import javafx.application.Application; 
import javafx.beans.property.ReadOnlyDoubleProperty; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.geometry.Side; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyCodeCombination; 
import javafx.scene.input.KeyCombination; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

/** 
* Example of creating menus in JavaFX. 
* 
* @author Dustin 
*/ 
public class JavaFxMenus extends Application 
{ 
    /** 
    * Build menu bar with included menus for this demonstration. 
    * 
    * @param menuWidthProperty Width to be bound to menu bar width. 
    * @return Menu Bar with menus included. 
    */ 
    private MenuBar buildMenuBarWithMenus(final ReadOnlyDoubleProperty menuWidthProperty) 
    { 
     final MenuBar menuBar = new MenuBar(); 

     // Prepare left-most 'File' drop-down menu 
     final Menu fileMenu = new Menu("File"); 

     menuBar.getMenus().add(fileMenu); 
     //menuBar.getOnMouseClicked().handle(this); 


     // Prepare 'Examples' drop-down menu 
     final Menu examplesMenu = new Menu("JavaFX 2.0 Examples"); 
     examplesMenu.getItems().add(new MenuItem("Text Example")); 
     examplesMenu.getItems().add(new MenuItem("Objects Example")); 
     examplesMenu.getItems().add(new MenuItem("Animation Example")); 
     menuBar.getMenus().add(examplesMenu); 

     // Prepare 'Help' drop-down menu 
     final Menu helpMenu = new Menu("Help"); 
     helpMenu.setOnAction(null); 

     final MenuItem searchMenuItem = new MenuItem("Search"); 
     searchMenuItem.setDisable(true); 
     helpMenu.getItems().add(searchMenuItem); 
     final MenuItem onlineManualMenuItem = new MenuItem("Online Manual"); 
     onlineManualMenuItem.setVisible(false); 
     helpMenu.getItems().add(onlineManualMenuItem); 
     helpMenu.getItems().add(new SeparatorMenuItem()); 
     final MenuItem aboutMenuItem = 
     MenuItemBuilder.create() 
         .text("About") 
         .onAction(
          new EventHandler<ActionEvent>() 
          { 
           @Override public void handle(ActionEvent e) 
           { 
            out.println("You clicked on About!"); 
           } 
          }) 
         .accelerator(
          new KeyCodeCombination(
           KeyCode.A, KeyCombination.CONTROL_DOWN)) 
         .build();    
     helpMenu.getItems().add(aboutMenuItem); 
     menuBar.getMenus().add(helpMenu); 

     // bind width of menu bar to width of associated stage 
     menuBar.prefWidthProperty().bind(menuWidthProperty); 

     return menuBar; 
    } 

    /** 
    * Start of JavaFX application demonstrating menu support. 
    * 
    * @param stage Primary stage. 
    */ 
    @Override 
    public void start(final Stage stage) 
    { 
     stage.setTitle("Creating Menus with JavaFX 2.0"); 
     final Group rootGroup = new Group(); 
     final Scene scene = new Scene(rootGroup, 800, 400, Color.WHEAT); 



     final MenuBar menuBar = buildMenuBarWithMenus(stage.widthProperty()); 
     rootGroup.getChildren().add(menuBar); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    /** 
    * Main executable function for running examples. 
    * 
    * @param arguments Command-line arguments: none expected. 
    */ 
    public static void main(final String[] arguments) 
    { 
     Application.launch(arguments); 
    } 
} 

Trả lời

14

AFAIK, A Menu, nếu đã không có menu con thêm vào hoặc Menuitem s, không cháy, sự kiện không phải trên nhấp chuột, trên thể hiện cũng không vào ẩn. Tuy nhiên, cách giải quyết là để thiết lập đồ họa của nó, nơi nút đồ họa này sẽ xử lý cú click chuột ví dụ,

Label menuLabel = new Label("File"); 
menuLabel.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 

     Stage myDialog = new Stage(); 
     myDialog.initModality(Modality.WINDOW_MODAL); 

     Scene myDialogScene = new Scene(VBoxBuilder.create() 
      .children(new Text("Hello! it's My Dialog.")) 
      .alignment(Pos.CENTER) 
      .padding(new Insets(10)) 
      .build()); 

     myDialog.setScene(myDialogScene); 
     myDialog.show(); 
    } 
}); 
Menu fileMenuButton = new Menu(); 
fileMenuButton.setGraphic(menuLabel); 
menuBar.getMenus().add(fileMenuButton); 

Một nhược điểm của phương pháp này là các nhãn không bao gồm tất cả các không gian của menu xuất hiện nhấp vào cạnh của menu không kích hoạt sự kiện chuột. Xem phần này bằng cách bỏ ghi chú số menuLabel.setStyle ở trên. Nhưng điều này có thể được giải quyết bằng cách chơi với phong cách CSS tôi nghĩ.
Mã được lấy một phần từ Create Dialog using Stage. Bạn cũng có thể tải tệp FXML vào giai đoạn myDialog bằng cách sử dụng FXMLLoader. Có rất nhiều ví dụ về nó trên mạng.

-2

Tôi nghĩ bạn không thể cho phép bất kỳ hành động nào trên nhãn Menu chính.

Tuy nhiên, bạn có thể tạo ngăn xếp chồng và điền vào bằng văn bản và thanh trình đơn.

+0

Điều này không đúng ... –

3

Gần đây tôi đã có cùng một vấn đề, đây là những gì tôi đã làm

@FXML private Menu myMenu; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 

    myMenu.setGraphic(
     ButtonBuilder.create() 
      .text("btnText") 
      .onAction(new EventHandler<ActionEvent>(){ 
       @Override public void handle(ActionEvent t) { 
        //TODO 
      } }) 
      .build() 
    ); 
} 
0

Gần đây tôi phải đối mặt với cùng một vấn đề, đây là cách của tôi ra:

Tôi đã có một MenuItem trong menu, đó là cư xử như thể menuItem được nhấp (trong trường hợp của bạn là menu File). Vì vậy, những gì bạn có thể làm là có một MenuItem Dummy_menuItem

final Menu fileMenu = new Menu("File"); 
fileMenu.getItems().add(new MenuItem("Dummy_menuItem")); 
menuBar.getMenus().add(fileMenu); 

và sau đó vào click File menu, bắn Dummy_menuItem MenuItem hay bất kỳ chức năng bạn muốn có. Để xác định được đơn nên có thuộc tính này, tôi sử dụng numberOfMenuItems để có được số lượng menuItems trong các menu trong thanh menu

if (numberOfMenuItems == 1) { 
    menu.showingProperty().addListener(
     (observableValue, oldValue, newValue) -> { 
      if (newValue) { 
       // the first menuItem is triggered 
       menu.getItems().get(0).fire(); 
      } 
     } 
    ); 
} 

kết quả là Dummy_menuItem được kích hoạt mà không có bối cảnh hiển thị các MenuItem trên click File menu hoặc bất kỳ menu nào có một menuItem. Vì vậy, có vẻ như bạn đã nhấp vào menu File và được chuyển hướng đến trang khác hoặc bất kỳ trang nào.

Hy vọng điều này sẽ giúp ích !!

0

Kết hợp với câu trả lời từ người bạn của chúng tôi @Dota2, tôi đã xây dựng một lớp helper để kích hoạt onAction(Menu menu) sự kiện 's Menu ngay cả khi nó không có bất kỳ MenuItem bên trong.Dưới đây là phương pháp tĩnh helper:

public static void onAction(Menu menu) 
{ 
    final MenuItem menuItem = new MenuItem(); 

    menu.getItems().add(menuItem); 
    menu.addEventHandler(Menu.ON_SHOWN, event -> menu.hide()); 
    menu.addEventHandler(Menu.ON_SHOWING, event -> menu.fire()); 
} 

Sau đó, bạn gọi:

YourHelperClass.onAction(myMenu); 

Và sẵn sàng! Tôi hi vọng cái này giúp được.

Các vấn đề liên quan