将MenuItem添加到多个菜单

时间:2017-04-30 13:17:35

标签: java javafx javafx-8

我目前正在为JavaFX8中的库(用于书籍)编写MenuBar。我想将MenuItem添加到几个菜单中。如果我这样做,则输出是一个警告,表示已经添加了此MenuItem,并且在应用程序中未显示“书籍菜单”。

代码:

import javafx.application.Application;
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.stage.Stage;

public class Main extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    public void start(Stage stage) {

        //Layout: BorderPane
        BorderPane layout = new BorderPane();

        //Define what is where
        layout.setTop(addMenuBar());

        //make it visible
        Scene scene = new Scene(layout, 900, 600);
        stage.setScene(scene);
        stage.setTitle("Library");
        stage.show();
    }

    public MenuBar addMenuBar() {
        //create the menubar
        MenuBar menu = new MenuBar();

        //create the menus
        Menu fileMenu = new Menu("File");
        Menu bookMenu = new Menu("Book");
        Menu manageMenu = new Menu("Manage");
        Menu sortMenu = new Menu("Sort");

        //create the menu items
        MenuItem exitItem = new MenuItem("Exit");
        MenuItem booksAlphabetical = new MenuItem("Books alphabetical");
        MenuItem encAlphabetical = new MenuItem("Encyclopedias alphabetical");
        MenuItem addBook = new MenuItem("Add book");
        MenuItem addCategory = new MenuItem("Add category");
        MenuItem addPublisher = new MenuItem("Add Publisher");
        MenuItem booksReview = new MenuItem("Books sorted by review"); 


        //make the menus ready


        //file menu
        fileMenu.getItems().add(exitItem);

        //bookMenu
        bookMenu.getItems().addAll(addBook, booksAlphabetical,
            encAlphabetical, booksReview); 
        //manageMenu
        manageMenu.getItems().addAll(addBook, addCategory, addPublisher);

        //sortMenu
        sortMenu.getItems().addAll(booksAlphabetical, encAlphabetical, booksReview);

        //add menus to the menubar
        menu.getMenus().addAll(fileMenu, bookMenu, manageMenu, sortMenu);

        //return the menubar
        return menu;
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:1)

简单地说,这是因为您将一个节点放到两个不同的父节点上(请参阅booksAlphabetical使用过两次):

bookMenu.getItems().addAll(addBook, booksAlphabetical, encAlphabetical, booksReview); 
sortMenu.getItems().addAll(booksAlphabetical, encAlphabetical, booksReview);

我们不知道MenuItem booksAlphabetical, encAlphabetical, booksReview应该出现在哪里,因此它们只会添加到最后一个sortMenu

为什么会这样?构建JavaFX API,每个Node都有一组属性,包括父属性,只有一个属性。

解决方案是第二次创建它们以使它们成为唯一的,因为你想要使用它们两次。

MenuItem booksAlphabeticalSort = new MenuItem("Books alphabetical");
MenuItem encAlphabeticalSort  = new MenuItem("Encyclopedias alphabetical");
MenuItem booksReviewSort = new MenuItem("Books sorted by review"); 

sortMenu.getItems().addAll(booksAlphabeticalSort, encAlphabeticalSort, booksReviewSort);