MenuButton
π¦ What is a MenuButton in JavaFX?
π§± Simple Definition
A MenuButton is a button that shows a dropdown menu when you click it.
π It combines:
- A button
- A list of options (menu items)
π§ How to think about it
Instead of having multiple buttons like:
- Light Theme
- Dark Theme
- Blue Theme
π You group them into one button β cleaner UI
βοΈ Structure (Concept)
A MenuButton has:
- Text (label) β what user sees
- MenuItems β options inside dropdown
πΉ Example Structure
MenuButton menu = new MenuButton("Select Theme");
MenuItem item1 = new MenuItem("Light");
MenuItem item2 = new MenuItem("Dark");
menu.getItems().addAll(item1, item2);
π How it works
- User clicks the MenuButton
- A dropdown menu appears
- User selects an option
- That option triggers an action
β‘ Important Behavior
π The MenuButton itself is NOT the action
The action happens in:
MenuItem.setOnAction(...)
π MenuButton vs Button
| Feature | Button | MenuButton |
|---|---|---|
| Single action | β | β |
| Multiple choices | β | β |
| Dropdown | β | β |
π MenuButton vs ChoiceBox
| Feature | MenuButton | ChoiceBox |
|---|---|---|
| Shows dropdown | β | β |
| Stores value | β | β |
| Used for actions | β | β |
π Important:
- ChoiceBox β selection
- MenuButton β actions
π§© Real Example (Your Case)
You used:
<MenuButton text="Select Theme">
Inside it:
<MenuItem text="Dark Theme" onAction="#selectDarkTheme"/>
π When user clicks:
- "Dark Theme" β method
selectDarkTheme()runs
β οΈ Common Mistake
Thinking this works:
menuButton.setOnAction(...)
β Wrong in most cases
βοΈ Correct:
menuItem.setOnAction(...)
π― When to use MenuButton
Use it when:
- You have multiple related actions
- You want a clean UI
- You donβt need to store selection as a value
π₯ Summary
- MenuButton = button + dropdown menu
- Contains MenuItems
- Each item triggers its own action
- Used for grouped actions
π FXML Layout (UI Design)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.MenuButton?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.Label?>
<VBox fx:id="root"
alignment="CENTER"
spacing="20.0"
xmlns:fx="http://javafx.com/fxml"
fx:controller="org.example.demo.HelloController">
<!-- Title -->
<Label text="Choose a theme:"
style="-fx-font-size: 18px;" />
<!-- Dropdown Menu -->
<MenuButton fx:id="themeButton"
text="Select Theme">
<items>
<MenuItem text="Light Theme"
onAction="#selectLightTheme"/>
<MenuItem text="Dark Theme"
onAction="#selectDarkTheme"/>
<MenuItem text="Blue Theme"
onAction="#selectBlueTheme"/>
</items>
</MenuButton>
<!-- Result Label -->
<Label fx:id="resultLabel"
text="No theme selected yet."
style="-fx-font-size: 16px;" />
</VBox>
π§ Explanation (FXML)
πΉ VBox (Root Container)
<VBox fx:id="root" alignment="CENTER" spacing="20.0">
- Layout that arranges elements vertically
fx:id="root"β linked to controlleralignment="CENTER"β everything centeredspacing="20"β space between elements
πΉ Label (Title)
<Label text="Choose a theme:" />
- Just displays text
- Styled with bigger font
πΉ MenuButton (Dropdown)
<MenuButton fx:id="themeButton">
- Works like a dropdown button
- Contains menu items
πΉ MenuItem (Options)
<MenuItem text="Light Theme" onAction="#selectLightTheme"/>
- Each item triggers a method in controller
#selectLightThemeβ calls Java method
πΉ Result Label
<Label fx:id="resultLabel" />
- Used to display selected theme message
- Connected to controller
π» Controller (Logic)
package org.example.demo;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.MenuButton;
import javafx.scene.layout.VBox;
public class HelloController {
@FXML
private VBox root;
@FXML
private MenuButton themeButton;
@FXML
private Label resultLabel;
@FXML
private void selectLightTheme() {
root.setStyle("-fx-background-color: white;");
resultLabel.setText("Light theme selected.");
resultLabel.setStyle("-fx-text-fill: black; -fx-font-size: 16px;");
themeButton.setText("Light Theme");
}
@FXML
private void selectDarkTheme() {
root.setStyle("-fx-background-color: #2b2b2b;");
resultLabel.setText("Dark theme selected.");
resultLabel.setStyle("-fx-text-fill: white; -fx-font-size: 16px;");
themeButton.setText("Dark Theme");
}
@FXML
private void selectBlueTheme() {
root.setStyle("-fx-background-color: lightblue;");
resultLabel.setText("Blue theme selected.");
resultLabel.setStyle("-fx-text-fill: darkblue; -fx-font-size: 16px;");
themeButton.setText("Blue Theme");
}
}
π§ Explanation (Controller)
πΉ @FXML Fields
@FXML private VBox root;
@FXML private MenuButton themeButton;
@FXML private Label resultLabel;
π These connect Java code with FXML
rootβ main layoutthemeButtonβ dropdown buttonresultLabelβ text display
πΉ Theme Methods
Each method is triggered when user selects a menu item.
π Light Theme
root.setStyle("-fx-background-color: white;");
- Changes background to white
resultLabel.setText("Light theme selected.");
- Updates text
themeButton.setText("Light Theme");
- Updates button title
π Dark Theme
root.setStyle("-fx-background-color: #2b2b2b;");
- Dark background
resultLabel.setStyle("-fx-text-fill: white;");
- White text for visibility
π΅ Blue Theme
root.setStyle("-fx-background-color: lightblue;");
- Blue background
π Full Flow (Important)
User clicks MenuButton
Selects a theme
MenuItemtriggers methodMethod:
- Changes background
- Updates label text
- Updates button text
β οΈ Notes
- You are using inline CSS (
setStyle) - Better in real apps β use external CSS file
@FXMLis required to link UI with controller
π₯ Summary
- FXML = UI structure
- Controller = logic
- MenuButton = dropdown
- MenuItem = triggers actions
setStyle()= changes appearance