Javafx - How to Create a Thin Menubar

JavaFX - How to create a thin MenuBar?

Adding the following selectors to you stylesheet reduces the height of each menu element:

.menu-item { -fx-padding: 1 5 1 5; }
.menu { -fx-padding: 1 5 1 5; }

Sample Image

To remove the padding of all context menus, you can additionally add:

.menu .context-menu { -fx-padding: 1 1 1 1; }

Sample Image

And you can also decrease the font size:

.menu-item >.label {-fx-font-size:9;}
.menu >.label {-fx-font-size:9;}

Sample Image

Furthermore you can remove the left right padding of the MenuBar and decrease the spacing:

.menu-bar {
-fx-padding: 0 1 0 1;
-fx-spacing: 1;
};

Sample Image

JavaFx, how to add menuBar and drawingPane

Fixed your layout.

What i did was:

The BorderPane is now your root Pane.

The ScrollPane is the center of the BorderPane and its content is the drawingPane.

The MenuBar is still the the Top of the BorderPane.

I also changed the Mouse Events from borderPane to drawingPane and the lines are added to the drawingPane instead of the borderPane.

So its working fine.

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class Example12a extends Application {

public static void main(String[] args) {
launch(args);
}

private Line curLine;

@Override
public void start(Stage stage) throws Exception {
Pane drawingPane = new Pane();
BorderPane theBorderPane = new BorderPane();

drawingPane.setPrefSize(800, 800);
drawingPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

MenuBar menuBar = new MenuBar();
// --- Menu File
Menu menuFile = new Menu("File");
MenuItem add = new MenuItem("Save");
add.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
System.out.println("Save");
}
});
menuFile.getItems().addAll(add);
//yOffset = (int)menuBar.getHeight();
Menu menuEdit = new Menu("Edit");
Menu menuView = new Menu("View");
menuBar.getMenus().addAll(menuFile, menuEdit, menuView);
theBorderPane.setTop(menuBar);

ScrollPane scrollPane = new ScrollPane(drawingPane);
scrollPane.setPrefSize(300, 300);
scrollPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
scrollPane.setFitToWidth(true);
scrollPane.setFitToHeight(true);
scrollPane.setStyle("-fx-focus-color: transparent;");

drawingPane.setOnMousePressed(event -> {
if (!event.isPrimaryButtonDown()) {
return;
}

curLine = new Line(
event.getX(), event.getY(),
event.getX(), event.getY()
);
drawingPane.getChildren().add(curLine);
});

drawingPane.setOnMouseDragged(event -> {
if (!event.isPrimaryButtonDown()) {
return;
}

if (curLine == null) {
return;
}

curLine.setEndX(event.getX());
curLine.setEndY(event.getY());

double mx = Math.max(curLine.getStartX(), curLine.getEndX());
double my = Math.max(curLine.getStartY(), curLine.getEndY());

if (mx > drawingPane.getMinWidth()) {
drawingPane.setMinWidth(mx);
}

if (my > drawingPane.getMinHeight()) {
drawingPane.setMinHeight(my);
}
});

theBorderPane.setOnMouseReleased(event -> curLine = null);

theBorderPane.setCenter(scrollPane);
Scene scene = new Scene(theBorderPane);
stage.setMinWidth(100);
stage.setMinHeight(100);
stage.setScene(scene);

stage.show();
}
}

Sample Image

Note:

if your trying to make a Drawing Programm I would prevere to Render all Lines in a Canvas instead of using the Line class. The Canvas is much faster with many Lines.



Related Topics



Leave a reply



Submit