2013-04-23 2 views
0

У меня есть это меню JavaFX, который не работает должным образом:меню Изменение размера в слое

public class CreatingMenus { 

    // Generate Menu 
    public void initMenu(Stage primaryStage, Group root, Scene scene) { 

     // Call Menu Actions from Java Method MenuActions 
     final MenuActions ma = new MenuActions(); 

     MenuBar menuBar = new MenuBar(); 

     // File menu - new, save, close, exit 
     Menu menu = new Menu("File"); 
     menu.getItems().add(new MenuItem("New")); 
     menu.getItems().add(new MenuItem("Save")); 
     menu.getItems().add(new MenuItem("Close")); 
     menu.getItems().add(new SeparatorMenuItem()); 

     MenuItem menuItem = new MenuItem("Exit"); 

     // Exit from the application 
     menuItem.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent e) { 
       // This Java Method is called from the Java Class MenuActions 
       ma.programExit(); // Exit program 
      } 
     }); 

     menu.getItems().add(menuItem); 

     menuBar.getMenus().add(menu); 

     // Options menu - Preferences 
     Menu options = new Menu("Options"); 
     options.getItems().add(new MenuItem("Preferences")); 

     menuBar.getMenus().add(options); 

     // Help menu - About 
     Menu help = new Menu("Help"); 

     MenuItem helpItem = new MenuItem("About"); 

     // Exit from the application 
     helpItem.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent e) { 
       aboutDialog(); 
      } 
     }); 

     help.getItems().add(helpItem); 

     menuBar.getMenus().add(help); 

     menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); 

     menuBar.setLayoutX(0); 
     menuBar.setLayoutY(0); 

     root.getChildren().add(menuBar); 

    } 

    public void aboutDialog() { 

     final int xSize = 640; 
     final int ySize = 480; 
     final String logoImage = "/logo.png"; 
     final Color backgroundColor = Color.WHITE; 
     final String text = "SQL Browser"; 
     final String version = "Product Version: 1.0"; 
     final String license = "License Information"; 

     final Stage aboutDialog = new Stage(); 
     aboutDialog.initModality(Modality.WINDOW_MODAL); 

     GridPane grid = new GridPane(); 
     grid.setAlignment(Pos.CENTER); 
     grid.setHgap(10); 
     grid.setVgap(10); 
     grid.setPadding(new Insets(20, 20, 20, 20)); 

     // Logo 
     Image image = new Image(getClass().getResourceAsStream(logoImage)); 
     ImageView logo = new ImageView(image); 

     grid.add(logo, 1, 0); 

     // Product name 
     Text productName = new Text(text); 
     productName.setFont(Font.font("Verdana", 12)); 
     grid.add(productName, 0, 2); 

     // Product version 
     Text productVersion = new Text(version); 
     productVersion.setFont(Font.font("Verdana", 12)); 
     grid.add(productVersion, 0, 3); 

     // Product License 
     Text productLicense = new Text(license); 
     productLicense.setFont(Font.font("Verdana", 12)); 
     grid.add(productLicense, 0, 4); 

     // Close Button 
     Button closeButton = new Button("Close"); 

     closeButton.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent arg0) { 
       // Close the dialog when "Close" button is pressed 
       aboutDialog.close(); 
      } 
     }); 
     grid.add(closeButton, 5, 18); 

     // Configure dialog size and background color 
     Scene aboutDialogScene = new Scene(grid, xSize, ySize, backgroundColor); 
     aboutDialog.setScene(aboutDialogScene); 
     aboutDialog.show(); 

    } 
} 

Когда я добавляю это меню он отменяет другие компоненты в приложении, и они не отвечают, потому что я полагаю, что они за этим слой. Можете ли вы рассказать, как я могу изолировать это меню в отдельном слое, потому что я не хочу размещать другие компоненты.

EDIT

При использовании кода меню я получаю этот результат:

enter image description here

Когда я удалить код из меню я получаю этот результат, и приложение работает правильно :

Проблема где-то в коде меню.

+0

Пожалуйста, добавьте [SSCCE] (http://sscce.org/). – Kai

+0

Я обновил сообщение. –

+0

Возможно, вы добавили меню в неправильный родитель. Ваш код не показывает, какую группу вы добавляете и что происходит до и после. – Kai

ответ

1

Работает для меня без изменений. Вы можете проверить свои версии Java/JavaFx. Я использую 1.7_17, 64 бит в окнах. enter image description here

Я добавил несколько изображений (у меня их нет), чтобы убедиться, что поведение, которое вы получаете, не из-за них.

+0

Я не использую Netbeans, извините. Вы также можете запустить свой проект из командной строки с любой другой установкой java. – Kai

+0

Возможно, это проблема с javafx на centos, да. Чтобы обойти эту проблему, попробуйте запустить один из [примеров] (http://docs.oracle.com/javafx/2/ui_controls/menu_controls.htm). Ваш код работает на моей машине на окнах 7. – Kai

+0

Я нашел причину проблемы! Я удаляю эту строку: 'menuBar.prefWidthProperty(). Bind (primaryStage.widthProperty());' И меню не авто размер. –

2

Сцена Ширин Binding

Ширин Этап содержит границы окна и строку заголовка - которые не имеют отношение к внутренней компоновке.

Чтобы заполнить всю ширину сцены с чем-то с помощью связывания, связать предпочтительный размер вещи до размера сцены, а не размер сцены:

menuBar.prefWidthProperty().bind(menuBar.getScene().widthProperty()); 

Или (обычно предпочтительный), вы можете использовать альтернативные панели макета и макеты, которые автоматически выполняют калибровку. Для вашего конкретного макета может оказаться полезным BorderPane.

У вас могут возникнуть дополнительные проблемы с вашей реализацией, которые вызывают проблемы (я не проверял).

Использование групп для макета

Ваш код Pastebin использует Group для главного корня макета сцены. Группа, как правило, представляет собой плохой выбор для размещения экрана с гибким размером, подобным вашему примеру. Группа не переоценивается. Вместо этого рекомендуется использовать переоценку layout pane, как указано выше.

Support Tool

  1. ScenicView неоценима при отладке существующих проблем макета.
  2. SceneBuilder отлично подходит для быстрого прототипирования различных макетов.

Я настоятельно рекомендую использовать эти инструменты, чтобы помочь понять, как работают макеты, и предоставить вам инструменты и знания, необходимые для самостоятельной отладки макетов.

Смежные вопросы