In my Java Desktop Application I have a TableView in which I want to have a column with CheckBoxes.
I did find where this has been done http://www.jonathangiles.net/javafx/2.0/CellFactories/ but as the download is not available and because I don't know how soon Jonathan Giles will answer my email I thought I'd ask...
How do I put a CheckBox in a cell of my TableView?
Uses javafx.scene.control.cell.CheckBoxTableCell<S,T>
and the work's done !
ObservableList< TableColumn< RSSReader, ? >> columns = _rssStreamsView.getColumns(); [...] TableColumn< RSSReader, Boolean > loadedColumn = new TableColumn<>( "Loaded" ); loadedColumn.setCellValueFactory( new Callback<CellDataFeatures<RSSReader,Boolean>,ObservableValue<Boolean>>(){ @Override public ObservableValue<Boolean> call( CellDataFeatures<RSSReader,Boolean> p ){ return p.getValue().getCompleted(); }}); loadedColumn.setCellFactory( new Callback<TableColumn<RSSReader,Boolean>,TableCell<RSSReader,Boolean>>(){ @Override public TableCell<RSSReader,Boolean> call( TableColumn<RSSReader,Boolean> p ){ return new CheckBoxTableCell<>(); }}); [...] columns.add( loadedColumn );
UPDATE: same code using Java 8 lambda expressions
ObservableList< TableColumn< RSSReader, ? >> columns = _rssStreamsView.getColumns(); [...] TableColumn< RSSReader, Boolean > loadedColumn = new TableColumn<>( "Loaded" ); loadedColumn.setCellValueFactory( f -> f.getValue().getCompleted()); loadedColumn.setCellFactory( tc -> new CheckBoxTableCell<>()); [...] columns.add( loadedColumn );
Lines count is divided by two! (16 ==> 8)
UPDATE: same code using Java 10 "var" contextual word
var columns = _rssStreamsView.getColumns(); [...] var loadedColumn = new TableColumn<RSSReader, Boolean>( "Loaded" ); loadedColumn.setCellValueFactory( f -> f.getValue().getCompleted()); loadedColumn.setCellFactory( tc -> new CheckBoxTableCell<>()); [...] columns.add( loadedColumn );
EDIT to add full functional editable example (Java 8)
public class Os { private final StringProperty name = new SimpleStringProperty(); private final BooleanProperty delete = new SimpleBooleanProperty(); public Os( String nm, boolean del ) { name .set( nm ); delete.set( del ); } public StringProperty nameProperty () { return name; } public BooleanProperty deleteProperty() { return delete; } } public class FxEditableCheckBox extends Application { @Override public void start( Stage stage ) throws Exception { final TableView<Os> view = new TableView<>(); final ObservableList<TableColumn<Os, ?>> columns = view.getColumns(); final TableColumn<Os, Boolean> nameColumn = new TableColumn<>( "Name" ); nameColumn.setCellValueFactory( new PropertyValueFactory<>( "name" )); columns.add( nameColumn ); final TableColumn<Os, Boolean> loadedColumn = new TableColumn<>( "Delete" ); loadedColumn.setCellValueFactory( new PropertyValueFactory<>( "delete" )); loadedColumn.setCellFactory( tc -> new CheckBoxTableCell<>()); columns.add( loadedColumn ); final ObservableList<Os> items = FXCollections.observableArrayList( new Os( "Microsoft Windows 3.1" , true ), new Os( "Microsoft Windows 3.11" , true ), new Os( "Microsoft Windows 95" , true ), new Os( "Microsoft Windows NT 3.51", true ), new Os( "Microsoft Windows NT 4" , true ), new Os( "Microsoft Windows 2000" , true ), new Os( "Microsoft Windows Vista" , true ), new Os( "Microsoft Windows Seven" , false ), new Os( "Linux all versions :-)" , false )); view.setItems( items ); view.setEditable( true ); final Button delBtn = new Button( "Delete" ); delBtn.setMaxWidth( Double.MAX_VALUE ); delBtn.setOnAction( e -> { final Set<Os> del = new HashSet<>(); for( final Os os : view.getItems()) { if( os.deleteProperty().get()) { del.add( os ); } } view.getItems().removeAll( del ); }); stage.setScene( new Scene( new BorderPane( view, null, null, delBtn, null ))); BorderPane.setAlignment( delBtn, Pos.CENTER ); stage.show(); } public static void main( String[] args ) { launch( args ); } }
EDIT to add full functional editable example (Java 10)
public class Os { private final StringProperty name = new SimpleStringProperty(); private final BooleanProperty delete = new SimpleBooleanProperty(); public Os( String nm, boolean del ) { name .set( nm ); delete.set( del ); } public StringProperty nameProperty () { return name; } public BooleanProperty deleteProperty() { return delete; } } public class FxEditableCheckBoxJava10 extends Application { @Override public void start( Stage stage ) throws Exception { final var view = new TableView<Os>(); final var columns = view.getColumns(); final var nameColumn = new TableColumn<Os, Boolean>( "Name" ); nameColumn.setCellValueFactory( new PropertyValueFactory<>( "name" )); columns.add( nameColumn ); final var loadedColumn = new TableColumn<Os, Boolean>( "Delete" ); loadedColumn.setCellValueFactory( new PropertyValueFactory<>( "delete" )); loadedColumn.setCellFactory( tc -> new CheckBoxTableCell<>()); columns.add( loadedColumn ); final var items = FXCollections.observableArrayList( new Os( "Microsoft Windows 3.1" , true ), new Os( "Microsoft Windows 3.11" , true ), new Os( "Microsoft Windows 95" , true ), new Os( "Microsoft Windows NT 3.51", true ), new Os( "Microsoft Windows NT 4" , true ), new Os( "Microsoft Windows 2000" , true ), new Os( "Microsoft Windows Vista" , true ), new Os( "Microsoft Windows Seven" , false ), new Os( "Linux all versions :-)" , false )); view.setItems( items ); view.setEditable( true ); final var delBtn = new Button( "Delete" ); delBtn.setMaxWidth( Double.MAX_VALUE ); delBtn.setOnAction( e -> { final var del = new HashSet<Os>(); for( final var os : view.getItems()) { if( os.deleteProperty().get()) { del.add( os ); } } view.getItems().removeAll( del ); }); stage.setScene( new Scene( new BorderPane( view, null, null, delBtn, null ))); BorderPane.setAlignment( delBtn, Pos.CENTER ); stage.show(); } public static void main( String[] args ) { launch( args ); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With