Jetzt anmelden...

Login
Passwort
Registrieren
27.08.21 1173 Views Kommentare [0] 2 0

credit: ©7030Artwork

JAVA Tutorial #55

JavaFX Menus

Menus sind absolut essentlich, um dem Software-Anwender Übersicht und Kontrolle über das Programm zu geben. Wir zeigen dir in diesem Tutorial, wie man eine MenuBar und ein Kontext-Menu erstellt und welche nützlichen Tricks es dazu noch gibt.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Thema in Kurzform

  • Die MenuBar ist die Menuleiste am oberen Rand von Desktop-AnwendungenKurze Info
  • Ein ContextMenu popt durch einem Rechtsklick an der geklickten Stelle auf.

Wie ist die MenuBar aufgebaut?

Die JavaFX MenuBar liefert der GUI ein "Drop Down"-Menu im oberen Bereich des Programms, wie man es von den meisten Desktop-Anwendungen kennt. Hier ist ein Screenshot mit einem Beispiel, das den Aufbau der MenuBar zeigt:

JavaFX

  • Die MenuBar wird durch die Klasse javafx.scene.control.MenuBar repräsentiert.
  • Untergliedert ist die MenuBar in einzelne Menus (javafx.scene.control.Menu).
  • Ein Menu besteht wiederum aus mehreren MenuItems (javafx.scene.control.MenuItem).

Eine vollständige MenuBar erstellen

Eine MenuBar inklusive einzelner Menus und MenuItems zu erstellen, ist sehr einfach. Zuerst erzeugst du eine Instanz von MenuBar:

MenuBar menuBar = new MenuBar();

Anschließend machst du dir Gedanken, welche Menus du brauchst. Testweise erzeugen wir zwei gebräuchliche Menus. Die Namen der Menus legen wir über den Konstruktur fest:

Menu menu = new Menu("Datei");
Menu menu2 = new Menu("Bearbeiten");                

Jetzt fehlen noch die einzelnen MenuItems:

MenuItem item1 = new MenuItem("Öffnen...");
MenuItem item2 = new MenuItem("Speichern...");
MenuItem item3 = new MenuItem("Beenden...");                

Die MenuBar zusammenbasteln

Nun haben wir zwar einige Bestandteile unserer MenuBar. Allerdings wissen diese noch nichts voneinander und wir müssen diese erst noch in Beziehung zueinander setzen.

Deshalb weisen wir der MenuBar zunächst alle Menus zu. Das Menu "Datei" erhält die drei vorhandenen MenuItems:

menuBar.getMenus().addAll(menu, menu2);
menu.getItems().addAll(item1, item2, item3);   

In unserem Beispiel bleibt das Menu "Bearbeiten" also leer.

MenuBar dem SceneGraph hinzufügen

Damit das Konstrukt auch sichtbar wird, muss es noch dem SceneGraph hinzugefügt werden. Hier der vollständige Code:

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

public class G1_MenuBar extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        MenuBar menuBar = new MenuBar();
        Menu menu = new Menu("Datei");
        Menu menu2 = new Menu("Bearbeiten");
        MenuItem item1 = new MenuItem("Öffnen...");
        MenuItem item2 = new MenuItem("Speichern...");
        MenuItem item3 = new MenuItem("Beenden...");

        menu.getItems().addAll(item1, item2, item3);
        menuBar.getMenus().addAll(menu, menu2);

        VBox container = new VBox();
        container.getChildren().add(menuBar);
        Scene scene = new Scene(container, 400, 300);
        primaryStage.setScene(scene);
        primaryStage.show();

    }
}                

MenuItem Events

Die MenuItems im Beispiel reagieren noch nicht auf Klicks des Nutzers. Natürlich können wir eine solche Funktionalität in bekannter Weise mit dem Einbau eines EventHandlers herstellen:

item1.setOnAction(e-> {
    System.out.println("I come from a land down under");
});                

Verschachtelte Menus erstellen

Komplexe Programme benötigen komplexe Menus. Falls du Untermenus benötigst, kannst du das mit JavaFX problemlos umsetzen. Schau mal hier:

Java JavaFX Submenus

Dazu benötigen wir noch nicht einmal eine neue Technik. Der Trick ist, dass wir ein Menu-Node mit add() einfach einem anderen Menu hinzufügen:

MenuBar menuBar = new MenuBar();
Menu menu = new Menu("Hauptmenu");
Menu submenu = new Menu("Submenu...");
menuBar.getMenus().add(menu);

menu.getItems().add(submenu); // Submenu dem Hauptmenu hinzufügen

MenuItem item1 = new MenuItem("MenuItem A");
MenuItem item2 = new MenuItem("MenuItem B");
submenu.getItems().addAll(item1, item2);
            

Nützliche Erweiterungen

SeparatorMenuItem

Oftmals ist es sinnvoll, einzelne MenuItems innerhalb eines Menus optisch voneinander zu trennen. Für diesen Zweck gibt es das Node SeparatorMenuItem, das als graue Trennlinie zwischen den MenuItems fungiert. Hier ein Beispiel:

Java JavaFX SeparatorMenuItem

Der passende Code dazu sieht so aus:

SeparatorMenuItem sep = new SeparatorMenuItem();
menu.getItems().add(2, sep);                

Wie du siehst, wird ein SeparatorMenuItem genauso behandelt und in ein Menu eingefügt wie ein MenuItem.

Um die Position der Trennlinie im Menu festzulegen, geben wir bei der add-Methode als ersten Parameter noch einen entsprechenden Indexwert an. In unserem Beispiel bedeudet 2, dass die Trennlinie als drittes Node im Menu positioniert wird.

MenuItem mit Bild

Du kannst ein MenuItem neben dem Text auch mit einem Icon ausstatten:

Java JavaFX MenuItem mit Bild

Möglich wird das mittelts der setGraphic()-Methode, die wir auf der MenuItem-Referenz aufrufen. Der Parameter-Wert ist die Grafik-Datei:

item1.setGraphic(new ImageView(new Image(getClass().getResourceAsStream("icon.jpg"))));                

Beachte, dass sich die Bild-Datei im selben Package (bzw. einem relativen Unterordner) wie die .class-Files befinden sollte.

CheckMenuItem

JavaFX unterstützt MenuItems, die wie Checkboxen markierbar sind. Repräsentiert wird diese spezielle Form des MenuItems durch die Klasse CheckMenuItem.

Ein ausgewähltes CheckMenuItem wird mit einem kleinen Häkchen markiert:

Java JavaFX CheckMenuItem

Der Code dazu ist folgender:

CheckMenuItem check = new CheckMenuItem("alive?");
menu.getItems().add(check);     

Wie richtest du ein Kontext-Menu ein?

Anders als die MenuBar, erscheint ein Kontext-Menu erst nach einem Rechtsklick mit der Maus - und zwar dort, wo der User geklickt hat.

Java JavaFX ContectMenu

Das Kontext-Menu wird von der Klasse javafx.scene.control.ContextMenu repräsentiert. Die einzelnen Menupunkte sind wieder Objekte von MenuItem.

Die ContextMenu-Instanz selbst wird einem anderen Node hinzugefügt, auf dem dann durch Rechtsklick dann das Kontext-Menu geöffnet wird.

In unserem Beispiel ist das Kontext-Menu in eine TextArea integriert. Den vollständigen Code siehst du hier:

package JavaFxPlayground.Controls;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class G2_ContextMenu extends Application {

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

    @Override
    public void start(Stage primaryStage){

        ContextMenu contextMenu = new ContextMenu();
        MenuItem menuItem1 = new MenuItem("Choice 1");
        MenuItem menuItem2 = new MenuItem("Choice 2");
        MenuItem menuItem3 = new MenuItem("Choice 3");

        contextMenu.getItems().addAll(menuItem1,menuItem2,menuItem3);

        menuItem1.setOnAction( e-> {
            System.out.println("Ich bin erste Wahl.");
        });

        TextArea textArea = new TextArea();
        textArea.setContextMenu(contextMenu);

        VBox vBox = new VBox(textArea);
        Scene scene = new Scene(vBox);
        primaryStage.setScene(scene);
        primaryStage.setTitle("JavaFX App");
        primaryStage.show();
    }
}
                

Wie du siehst, ist das erste MenuItem mit einem EventHandler versehen. Beim Klick darauf erscheint ein entsprechender Text auf der Konsole.

Falconbyte unterstützen

Kommentar schreiben

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Objekte löschen

Wir wissen, wie wir Objekte erstellen können. Aber wie werden wir sie wieder los?

Primitive Datentypen

Am Ende des Kapitels werden Sie wissen, wie Primitive Datentypen korrekt eingesetzt werden.

Verzweigungen in Java

Eine zentrale Notwendigkeit der Programmierung sind Verzweigungen.

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2021 Stefan E. Heller

Impressum | Datenschutz

Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen