JavaFX 2.0 активирует меню как MenuItem
я делаю MenuBar
, и я не хочу функциональность, чтобы нажать Menu
like:" File", а затем выполните действие. Например, открытие другого fxml или пример, где записывается некоторый вывод.
Я хочу функциональность MenuItem
(ложь "о") в Menu
как "файл".
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);
}
}
5 ответов
AFAIK, A Menu
, если не добавлено подменю или Menuitem
ы, не пожаров, ни на кнопку, по показанному, ни скрыть. Однако обходной путь-установить его графику, где этот графический узел будет обрабатывать щелчки мыши, например,
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);
недостатком этого подхода является то, что метка не покрывает все пробелы меню, в результате чего щелчок по краям меню не запускает событие мыши. Увидеть это, удалив menuLabel.setStyle
выше линии. Но это можно решить с помощью игра с CSS
стили я думаю.
Код частично взят из создать диалог с помощью Stage. Вы также можете загрузить на myDialog
этап FXMLLoader
. Есть много примеров об этом в сети.
недавно у меня была такая же проблема, это то, что я сделал
@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()
);
}
недавно я столкнулась с той же проблемой, это был мой выход:
у меня был menuItem в меню, который должен был вести себя так, как будто menuItem щелкнул (в вашем случае ). Так что вы можете сделать, это иметь пункт меню Dummy_menuItem
final Menu fileMenu = new Menu("File");
fileMenu.getItems().add(new MenuItem("Dummy_menuItem"));
menuBar.getMenus().add(fileMenu);
и затем на кнопку , уволить Dummy_menuItem
menuItem или любая функциональность, которую вы хотите иметь. Чтобы определить, какое меню должно иметь это свойство, я использовал numberOfMenuItems
получить номер меню в меню menubar
if (numberOfMenuItems == 1) {
menu.showingProperty().addListener(
(observableValue, oldValue, newValue) -> {
if (newValue) {
// the first menuItem is triggered
menu.getItems().get(0).fire();
}
}
);
}
в результате Dummy_menuItem
запускается без контекста, отображающего меню по щелчку File
меню или любое меню, которое имеет один menuItem. Таким образом, кажется, что вы нажали File
меню и были перенаправлены на другую страницу или что-то еще.
надеюсь, что это помогает!!
в сочетании с ответом от нашего друга @Dota2, Я построил вспомогательный класс для запуска Menu
' s onAction(Menu menu)
событие, даже если у него нет MenuItem
внутри. Вот статический вспомогательный метод:
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());
}
затем звоните:
YourHelperClass.onAction(myMenu);
и готово! Надеюсь, это поможет.
Я думаю, вы не можете разрешить какие-либо действия на ярлыке главного меню.
однако вы можете создать stackpane и заполнить его текстом и строкой меню.