Enterprise-grade table component with checkboxes, search/filter, row actions, custom cell renderers, bulk actions, CSV export, and pagination.
Basic Usage
JTable<User> table = new JTable<>();
table.setStriped(true);
table.addColumn("Name", "name");
table.addColumn("Email", "email");
table.addColumn("Role", "role");
ObservableList<User> data = FXCollections.observableArrayList(
new User("John Doe", "[email protected]", "Admin"),
new User("Jane Smith", "[email protected]", "User")
);
table.setItems(data);
Searchable Table
Enable built-in search functionality:
JTable<Product> table = new JTable<>();
table.setSearchable(true);
table.setSearchPlaceholder("Search products...");
table.addColumn("Name", "name");
table.addColumn("SKU", "sku");
table.addColumn("Price", "price");
table.setItems(products);
Checkable Rows with Bulk Actions
JTable<Task> table = new JTable<>();
table.setCheckable(true);
table.setBulkActionsEnabled(true);
table.addColumn("Task", "title");
table.addColumn("Status", "status");
table.setOnCheckChange(selectedItems -> {
System.out.println("Selected: " + selectedItems.size());
});
table.setOnBulkDelete(items -> {
// Handle bulk deletion
table.removeItems(items);
});
table.setItems(tasks);
Custom Cell Renderers
Render custom nodes in table cells:
JTable<User> table = new JTable<>();
table.addColumn("Name", "name");
// Render role as a JChip
table.addColumn("Role", "role", user ->
new JChip(user.getRole())
.setColor(user.getRole().equals("Admin") ? "primary" : "secondary")
);
// Render status as JBadge
table.addColumn("Status", "status", user ->
new JBadge(user.getStatus())
.setVariant(user.isActive() ? JBadge.Variant.SUCCESS : JBadge.Variant.DANGER)
);
table.setItems(users);
Row Actions
Add action buttons to each row:
JTable<User> table = new JTable<>();
table.addColumn("Name", "name");
table.addColumn("Email", "email");
table.setRowActions((user, box) -> {
JButton editBtn = new JButton("Edit")
.setSize(JButton.ButtonSize.SM)
.setVariant(JButton.ButtonVariant.LIGHT_PRIMARY);
editBtn.setOnAction(e -> editUser(user));
JButton deleteBtn = new JButton("Delete")
.setSize(JButton.ButtonSize.SM)
.setVariant(JButton.ButtonVariant.LIGHT_DANGER);
deleteBtn.setOnAction(e -> deleteUser(user));
box.getChildren().addAll(editBtn, deleteBtn);
});
table.setItems(users);
Visual Modes
// Striped rows
table.setStriped(true);
// Dense mode (compact spacing)
table.setDense(true);
// Status bar
table.setStatusBarEnabled(true);
Row Click Handling
table.setOnRowClick(user -> {
System.out.println("Clicked: " + user.getName());
navigateToDetails(user);
});
JTable<Item> table = new JTable<>();
table.setItemsPerPage(20);
table.addColumn("Name", "name");
table.setItems(largeDataset);
// Access pagination control
JPagination pagination = table.getPagination();
pagination.setOnPageChange(() -> {
System.out.println("Page: " + pagination.currentPageProperty().get());
});
// Hide pagination for infinite scroll
table.setPaginationVisible(false);
table.setOnScrollBottom(() -> {
loadMoreData();
});
CSV Export
JButton exportBtn = new JButton("Export CSV");
exportBtn.setOnAction(e -> {
FileChooser chooser = new FileChooser();
chooser.setTitle("Export to CSV");
chooser.getExtensionFilters().add(
new FileChooser.ExtensionFilter("CSV Files", "*.csv")
);
File file = chooser.showSaveDialog(stage);
if (file != null) {
try {
table.exportToCSV(file);
JToast.show(stage, "Export successful", JToast.Type.SUCCESS,
JToast.Position.TOP_RIGHT, 3000);
} catch (IOException ex) {
ex.printStackTrace();
}
}
});
Empty State
table.setEmptyText("No users found");
table.setEmptyGraphic(new Label("📋"));
API Reference
Enable checkbox selection mode
Enable built-in search bar
Enable alternating row colors
Enable compact row spacing
addColumn(String, String)
Add a sortable column with title and property name
addColumn(String, String, Function<T, Node>)
Add a column with custom cell renderer
setRowActions(BiConsumer<T, HBox>)
Add action buttons to each row
setOnRowClick(Consumer<T>)
Handle row click events
setItems(ObservableList<T>)
Set table data
Get selected items in checkable mode
Export table data to CSV file
Scrollable list component with pagination and infinite scroll support.
Basic Usage
JList<String> list = new JList<>();
ObservableList<String> items = FXCollections.observableArrayList(
"Item 1", "Item 2", "Item 3"
);
list.setItems(items);
Custom Cell Factory
JList<User> list = new JList<>();
list.setCellFactory(param -> new ListCell<User>() {
@Override
protected void updateItem(User user, boolean empty) {
super.updateItem(user, empty);
if (empty || user == null) {
setGraphic(null);
} else {
HBox card = new HBox(10);
card.setAlignment(Pos.CENTER_LEFT);
JAvatar avatar = new JAvatar(user.getFirstName(), user.getLastName());
VBox info = new VBox(4);
Label name = new Label(user.getName());
name.setStyle("-fx-font-weight: bold;");
Label email = new Label(user.getEmail());
email.setStyle("-fx-text-fill: -color-text-muted;");
info.getChildren().addAll(name, email);
card.getChildren().addAll(avatar, info);
setGraphic(card);
}
}
});
list.setItems(users);
Infinite Scroll
JList<Item> list = new JList<>();
list.setPaginationVisible(false);
list.setOnScrollBottom(() -> {
System.out.println("Loading more...");
loadMoreItems();
});
list.setItems(initialItems);
JList<Product> list = new JList<>();
JPagination pagination = list.getPagination();
pagination.totalPagesProperty().set(10);
pagination.setOnPageChange(() -> {
int page = pagination.currentPageProperty().get();
loadPage(page);
});
list.setItems(products);
API Reference
setItems(ObservableList<T>)
Set list items
setOnScrollBottom(Runnable)
Handle scroll to bottom (infinite scroll)
Show or hide pagination controls
Access underlying ListView
Access pagination control