Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jewelsea/5470095 to your computer and use it in GitHub Desktop.
Save jewelsea/5470095 to your computer and use it in GitHub Desktop.
JavaFX TableView row highlighting sample using table row apis and css.
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.util.Callback;
// demonstrates highlighting rows in a tableview based upon the data values in the rows.
public class DebtCollectionTableWithRowHighlighting extends Application {
public static void main(String[] args) throws Exception { launch(args); }
@Override public void start(final Stage stage) throws Exception {
stage.setTitle("So called friends . . .");
// create a table.
TableView<Friend> table = new TableView(Friend.data);
table.getColumns().addAll(makeStringColumn("Name", "name", 150), makeStringColumn("Owes Me", "owesMe", 300), makeBooleanColumn("Will Pay Up", "willPay", 150));
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
stage.setScene(new Scene(table));
stage.getScene().getStylesheets().add(getClass().getResource("reaper.css").toExternalForm());
stage.show();
}
private TableColumn<Friend, String> makeStringColumn(String columnName, String propertyName, int prefWidth) {
TableColumn<Friend, String> column = new TableColumn<>(columnName);
column.setCellValueFactory(new PropertyValueFactory<Friend, String>(propertyName));
column.setCellFactory(new Callback<TableColumn<Friend, String>, TableCell<Friend, String>>() {
@Override public TableCell<Friend, String> call(TableColumn<Friend, String> soCalledFriendStringTableColumn) {
return new TableCell<Friend, String>() {
@Override public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
}
}
};
}
});
column.setPrefWidth(prefWidth);
return column;
}
private TableColumn<Friend, Boolean> makeBooleanColumn(String columnName, String propertyName, int prefWidth) {
TableColumn<Friend, Boolean> column = new TableColumn<>(columnName);
column.setCellValueFactory(new PropertyValueFactory<Friend, Boolean>(propertyName));
column.setCellFactory(new Callback<TableColumn<Friend, Boolean>, TableCell<Friend, Boolean>>() {
@Override public TableCell<Friend, Boolean> call(TableColumn<Friend, Boolean> soCalledFriendBooleanTableColumn) {
return new TableCell<Friend, Boolean>() {
@Override public void updateItem(final Boolean item, final boolean empty) {
super.updateItem(item, empty);
// clear any custom styles
this.getStyleClass().remove("willPayCell");
this.getStyleClass().remove("wontPayCell");
this.getTableRow().getStyleClass().remove("willPayRow");
this.getTableRow().getStyleClass().remove("wontPayRow");
// update the item and set a custom style if necessary
if (item != null) {
setText(item.toString());
this.getStyleClass().add(item ? "willPayCell" : "wontPayCell");
this.getTableRow().getStyleClass().add(item ? "willPayRow" : "wontPayRow");
}
}
};
}
});
column.setPrefWidth(prefWidth);
return column;
}
}
import javafx.collections.*;
/** Sample data for a table view */
public class Friend {
final static public ObservableList data = FXCollections.observableArrayList(
new Friend("George", "Movie Ticket", true),
new Friend("Irene", "Pay Raise", false),
new Friend("Ralph", "Return my Douglas Adams Books", false),
new Friend("Otto", "Game of Golf", true),
new Friend("Sally", "$12,045.98", false),
new Friend("Antoine", "Latte", true)
);
final private String name;
final private String owesMe;
final private boolean willPay;
public Friend(String name, String owesMe, boolean willPay) {
this.name = name; this.owesMe = owesMe; this.willPay = willPay;
}
public String getName() { return name; }
public String getOwesMe() { return owesMe; }
public boolean getWillPay() { return willPay; }
}
/** file: reaper.css
place in same directory as DebtCollectionTable.java */
.root { -fx-font: 18px "Comic Sans MS"; }
.column-header-background { -fx-background-color: azure; }
.willPayRow { -fx-background-color: palegreen; }
.wontPayRow { -fx-background-color: coral; }
.willPayCell { -fx-background-color: forestgreen; }
.wontPayCell { -fx-background-color: firebrick; }
.table-row-cell:empty { -fx-background-color: cornsilk; }
.table-row-cell:empty .table-cell { -fx-border-width: 0px; }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment