/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package testfittoparent; import java.util.Map; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.ScrollPane; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.stage.Stage; /** * * @author danielfuchs */ public class Main extends Application { public static void main(String[] args) { Application.launch(Main.class, args); } Menu initFakeMenu(int j) { final Menu fakeMenu; final MenuItem one; final MenuItem two; final MenuItem three; fakeMenu = new Menu("Fake-"+j); fakeMenu.setId("fakeMenu"+j); for (int i=0; i<(2*j)+4; i++) { final MenuItem m = new MenuItem("Menu"+i); m.setId("menu"+i+"MenuItem"); m.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { } }); m.setDisabled(i==1); fakeMenu.getItems().add(m); } return fakeMenu; } @Override public void start(Stage primaryStage) throws Exception { //System.setProperty("apple.laf.useScreenMenuBar", "true"); //Logging.getLayoutLogger().setLevel(PlatformLogger.FINEST); AnchorPane root = new AnchorPane(); Stage stage = primaryStage; Scene scene = new Scene(root, 600, 400, Color.BEIGE); scene.getStylesheets().add(Main.class.getResource("demo.css").toExternalForm()); stage.setScene(scene); ObservableList menus = FXCollections.observableArrayList(); for (int i=0; i<8; i++) { menus.add(initFakeMenu(i)); } final MenuBar menuBar = new MenuBar(); menuBar.setId("menuBar"); menuBar.getMenus().addAll(menus); setBlocksMouse(menuBar, true); root.getChildren().add(menuBar); AnchorPane area = new AnchorPane(); area.setId("area"); area.getStyleClass().add("area"); area.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); area.setPrefSize(600, 400); AnchorPane.setTopAnchor(area, max(menuBar.getPrefHeight(), menuBar.prefHeight(-1), 20.0)); AnchorPane.setBottomAnchor(area, 0.0); AnchorPane.setRightAnchor(area, 0.0); AnchorPane.setLeftAnchor(area, 0.0); Button button = new Button("Button"); button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); // AnchorPane.setTopAnchor(button, 0.0); // AnchorPane.setBottomAnchor(button, 0.0); // AnchorPane.setRightAnchor(button, 0.0); // AnchorPane.setLeftAnchor(button, 0.0); // AnchorPane container = new AnchorPane(); // container.getChildren().add(button); ScrollPane container = new ScrollPane(); container.setNode(button); AnchorPane.setTopAnchor(container, 0.0); AnchorPane.setBottomAnchor(container, 0.0); AnchorPane.setRightAnchor(container, 0.0); AnchorPane.setLeftAnchor(container, 0.0); area.getChildren().add(container); root.getChildren().add(area); stage.setVisible(true); stage.sizeToScene(); } private static final String blocksMouseInstalledKey = Main.class.getName() + ".installedBlocksMouse"; private static final String blocksMouseKey = Main.class.getName() + ".blocksMouse"; public static void setBlocksMouse(Node node, boolean blocksMouse) { installBlocksMouseHandler(node); final Map properties = node.getProperties(); properties.put(blocksMouseKey, blocksMouse); } private static void installBlocksMouseHandler(final Node node) { final Map properties = node.getProperties(); boolean installed = properties.containsKey(blocksMouseInstalledKey); if (!installed) { node.addEventHandler(MouseEvent.ANY, new EventHandler() { @Override public void handle(MouseEvent event) { // The onMouseWhatever handlers get called after the addEventHandler handlers, so // if we mark the event consumed here then the appropriate onMouseWhatever won't get it. // So we need to invoke it ourselves. if (properties.get(blocksMouseKey) == (Boolean) true) { event.consume(); } } }); properties.put(blocksMouseInstalledKey, true); } } private double max(double first, double... rest) { double max = first; for (double d : rest) { max = Math.max(max, d); } return max; } }