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);
Icon or graphic node displayed with the text
Fluent API Methods
Adding Items
Adds a single menu itemMenuItem item = new MenuItem("Option 1");
dropdown.addItem(item);
MenuItem to add to the dropdown
Returns this for method chaining.
Adds multiple menu itemsdropdown.addItems(
new MenuItem("Option 1"),
new MenuItem("Option 2"),
new MenuItem("Option 3")
);
Variable number of MenuItems to add
Returns this for method chaining.
Adds a simple text menu item with an action handlerdropdown.addAction("Delete", e -> {
System.out.println("Delete clicked");
});
action
EventHandler<ActionEvent>
required
Action handler to execute when item is clicked
Returns this for method chaining.
Styling
Adds custom style classes to the dropdowndropdown.addClass("btn-primary", "text-sm");
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());
}
});
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());
JDropdown extends MenuButton, so you have access to all standard features:
JDropdown menu = new JDropdown("Menu");
// Access menu items
ObservableList<MenuItem> 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);
}
- 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