Skip to main content

Overview

JDropdown is a styled MenuButton component with a fluent API for easily adding menu items and actions.

Constructors

// Text only
JDropdown dropdown = new JDropdown(String text);

// With graphic icon
JDropdown dropdown = new JDropdown(String text, Node graphic);
text
String
required
Button text label
graphic
Node
Icon or graphic node displayed with the text

Fluent API Methods

Adding Items

addItem
JDropdown
Adds a single menu item
MenuItem item = new MenuItem("Option 1");
dropdown.addItem(item);
item
MenuItem
required
MenuItem to add to the dropdown
Returns this for method chaining.
addItems
JDropdown
Adds multiple menu items
dropdown.addItems(
    new MenuItem("Option 1"),
    new MenuItem("Option 2"),
    new MenuItem("Option 3")
);
items
MenuItem...
required
Variable number of MenuItems to add
Returns this for method chaining.
addAction
JDropdown
Adds a simple text menu item with an action handler
dropdown.addAction("Delete", e -> {
    System.out.println("Delete clicked");
});
text
String
required
Menu item text
action
EventHandler<ActionEvent>
required
Action handler to execute when item is clicked
Returns this for method chaining.

Styling

addClass
JDropdown
Adds custom style classes to the dropdown
dropdown.addClass("btn-primary", "text-sm");
styleClasses
String...
required
Variable number of CSS class names to add
Returns this for method chaining.

Example Usage

Basic Dropdown

JDropdown menu = new JDropdown("Actions")
    .addAction("Edit", e -> editItem())
    .addAction("Delete", e -> deleteItem())
    .addAction("Duplicate", e -> duplicateItem());

With Icons

JDropdown userMenu = new JDropdown("John Doe", JIcon.USER.view())
    .addClass("btn-ghost")
    .addAction("Profile", e -> showProfile())
    .addAction("Settings", e -> showSettings())
    .addAction("Sign Out", e -> signOut());

With Separators and Custom Items

MenuItem editItem = new MenuItem("Edit");
editItem.setGraphic(JIcon.EDIT.view());

MenuItem deleteItem = new MenuItem("Delete");
deleteItem.setGraphic(JIcon.DELETE.view());
deleteItem.setStyle("-fx-text-fill: red;");

JDropdown menu = new JDropdown("Options", JIcon.MORE_VERT.view())
    .addItem(editItem)
    .addItem(new SeparatorMenuItem())
    .addItem(deleteItem);

Filter Dropdown

ToggleGroup filterGroup = new ToggleGroup();

RadioMenuItem allFilter = new RadioMenuItem("All Items");
allFilter.setToggleGroup(filterGroup);
allFilter.setSelected(true);

RadioMenuItem activeFilter = new RadioMenuItem("Active Only");
activeFilter.setToggleGroup(filterGroup);

RadioMenuItem archivedFilter = new RadioMenuItem("Archived");
archivedFilter.setToggleGroup(filterGroup);

JDropdown filterMenu = new JDropdown("Filter", JIcon.FILTER_LIST.view())
    .addClass("btn-outline")
    .addItems(allFilter, activeFilter, archivedFilter);

filterGroup.selectedToggleProperty().addListener((obs, old, sel) -> {
    if (sel != null) {
        RadioMenuItem selected = (RadioMenuItem) sel;
        applyFilter(selected.getText());
    }
});

Context Menu Alternative

TableView<User> table = new TableView<>();

table.setOnContextMenuRequested(event -> {
    User selectedUser = table.getSelectionModel().getSelectedItem();
    if (selectedUser != null) {
        ContextMenu contextMenu = new ContextMenu();
        
        MenuItem viewItem = new MenuItem("View Details");
        viewItem.setOnAction(e -> viewUser(selectedUser));
        
        MenuItem editItem = new MenuItem("Edit");
        editItem.setOnAction(e -> editUser(selectedUser));
        
        MenuItem deleteItem = new MenuItem("Delete");
        deleteItem.setOnAction(e -> deleteUser(selectedUser));
        
        contextMenu.getItems().addAll(viewItem, editItem, 
            new SeparatorMenuItem(), deleteItem);
        
        contextMenu.show(table, event.getScreenX(), event.getScreenY());
    }
});

Chained Configuration

JDropdown exportMenu = new JDropdown("Export", JIcon.DOWNLOAD.view())
    .addClass("btn-secondary", "btn-sm")
    .addAction("Export as CSV", e -> exportCSV())
    .addAction("Export as Excel", e -> exportExcel())
    .addAction("Export as PDF", e -> exportPDF())
    .addAction("Print", e -> print());

Accessing MenuButton Features

JDropdown extends MenuButton, so you have access to all standard features:
JDropdown menu = new JDropdown("Menu");

// Access menu items
ObservableList&lt;MenuItem&gt; items = menu.getItems();

// Show programmatically
menu.show();

// Hide
menu.hide();

// Check if showing
boolean isShowing = menu.isShowing();

// Set popup side
menu.setPopupSide(Side.BOTTOM);

Styling

Style classes:
  • .j-dropdown - Applied to all instances
  • Additional classes via addClass()
Custom CSS:
.j-dropdown {
    -fx-background-color: white;
    -fx-border-color: #e2e8f0;
    -fx-border-radius: 6px;
    -fx-padding: 8px 12px;
}

.j-dropdown:hover {
    -fx-background-color: #f8fafc;
}

.j-dropdown .menu-item {
    -fx-padding: 8px 16px;
}

.j-dropdown .menu-item:hover {
    -fx-background-color: rgba(59, 130, 246, 0.1);
}

Notes

  • Extends JavaFX MenuButton for full compatibility
  • Fluent API enables concise, readable configuration
  • addAction() is a convenience method for simple click handlers
  • Use standard MenuItem, RadioMenuItem, CheckMenuItem, SeparatorMenuItem
  • Icons can be added via JIcon.NAME.view() or any JavaFX Node

Build docs developers (and LLMs) love