How to add CheckBox's to a TableView in JavaFX

前端 未结 13 563
日久生厌
日久生厌 2020-11-30 00:32

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/

13条回答
  •  余生分开走
    2020-11-30 01:04

    Uses javafx.scene.control.cell.CheckBoxTableCell and the work's done !

      ObservableList< TableColumn< RSSReader, ? >> columns =
         _rssStreamsView.getColumns();
      [...]
      TableColumn< RSSReader, Boolean > loadedColumn = new TableColumn<>( "Loaded" );
      loadedColumn.setCellValueFactory(
        new Callback,ObservableValue>(){
            @Override public
            ObservableValue call( CellDataFeatures p ){
               return p.getValue().getCompleted(); }});
      loadedColumn.setCellFactory(
         new Callback,TableCell>(){
            @Override public
            TableCell call( TableColumn 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( "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 view = new TableView<>();
          final ObservableList> columns = view.getColumns();
    
          final TableColumn nameColumn = new TableColumn<>( "Name" );
          nameColumn.setCellValueFactory( new PropertyValueFactory<>( "name" ));
          columns.add(  nameColumn );
    
          final TableColumn loadedColumn = new TableColumn<>( "Delete" );
          loadedColumn.setCellValueFactory( new PropertyValueFactory<>( "delete" ));
          loadedColumn.setCellFactory( tc -> new CheckBoxTableCell<>());
          columns.add( loadedColumn );
    
          final ObservableList 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 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();
          final var columns    = view.getColumns();
          final var nameColumn = new TableColumn( "Name" );
          nameColumn.setCellValueFactory( new PropertyValueFactory<>( "name" ));
          columns.add(  nameColumn );
          final var loadedColumn = new TableColumn( "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();
             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 );
       }
    }
    

提交回复
热议问题