Skip to main content

JTable

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);
});

Pagination

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

setCheckable(boolean)
void
Enable checkbox selection mode
setSearchable(boolean)
void
Enable built-in search bar
setStriped(boolean)
void
Enable alternating row colors
setDense(boolean)
void
Enable compact row spacing
addColumn(String, String)
TableColumn
Add a sortable column with title and property name
addColumn(String, String, Function<T, Node>)
TableColumn
Add a column with custom cell renderer
setRowActions(BiConsumer<T, HBox>)
void
Add action buttons to each row
setOnRowClick(Consumer<T>)
void
Handle row click events
setItems(ObservableList<T>)
void
Set table data
getCheckedItems()
ObservableList<T>
Get selected items in checkable mode
exportToCSV(File)
void
Export table data to CSV file

JList

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);

With Pagination

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>)
void
Set list items
setCellFactory(Callback)
void
Set custom cell renderer
setOnScrollBottom(Runnable)
void
Handle scroll to bottom (infinite scroll)
setPaginationVisible(boolean)
void
Show or hide pagination controls
getListView()
ListView<T>
Access underlying ListView
getPagination()
JPagination
Access pagination control

Build docs developers (and LLMs) love