当前位置: 首页 > 知识库问答 >
问题:

javafx-当我滚动表视图时未选中复选框

终睿
2023-03-14

我有一个TableView,当我向下滚动表格时,复选框被取消选中。包含复选框的表格列是列,定义为:

final TableColumn col = new TableColumn("Select");
col.setCellValueFactory( new Callback<CellDataFeatures<pojo, CheckBox>, ObservableValue<CheckBox>>() {
     @Override
     public ObservableValue<CheckBox> call(CellDataFeatures<pojo, CheckBox> arg0) {
       final CheckBox checkBox = new CheckBox();

       checkBox.setOnAction(new EventHandler<ActionEvent>() {
             @Override
             public void handle(ActionEvent event) {

                CheckBox checkBox = (CheckBox) event.getSource();
                TableCellSkin tcs = (TableCellSkin)checkBox.getParent();
                TableCell tc = (TableCell)tcs.getSkinnable();
                TableRowSkin trs = (TableRowSkin)tc.getParent();
                TableRow tr = trs.getParent()!=null ? (TableRow) trs.getParent(): (TableRow)trs.getSkinnable();
                pojo obj = (pojo) tr.getItem();

                if(checkBox.isSelected()){
                    list.add(obj);
                }else{
                    if(list!=null && !list.isEmpty()){
                        list.remove(obj);
                    }
                }
             }
         });
         return new SimpleObjectProperty(checkBox);
     }
 });

共有1个答案

郝池暝
2023-03-14

下面是如何添加复选框列的完整示例,该复选框列与tableview的选择模型协同工作。选择模式设置为多个,因此您可以通过CTRL鼠标单击选择多个项目:

public class TableViewSelectColumnDemo extends Application
{

    private final TableView<Person> table = new TableView<>();
    private final ObservableList<Person> data
            = FXCollections.observableArrayList(
                    new Person( "Jacob", "Smith" ),
                    new Person( "Isabella", "Johnson" ),
                    new Person( "Ethan", "Williams" ),
                    new Person( "Emma", "Jones" ),
                    new Person( "Michael", "Brown" )
            );


    public static void main( String[] args )
    {
        launch( args );
    }


    @Override
    public void start( Stage stage )
    {
        Scene scene = new Scene( new Group() );
        stage.setWidth( 450 );
        stage.setHeight( 500 );

        table.getSelectionModel().setSelectionMode( SelectionMode.MULTIPLE );

        List list = new ArrayList();

        TableColumn selectCol = new TableColumn( "Select" );
        selectCol.setStyle( "-fx-alignment: center" );

        selectCol.setCellFactory(
                new Callback<TableColumn, TableCell>()
                {
                    public TableCell call( TableColumn p )
                    {
                        return new TableCell()
                        {
                            private final CheckBox checkBox = new CheckBox();


                            @Override
                            public void updateItem( Object item, boolean empty )
                            {
                                super.updateItem( item, empty );
                                setText( null );

                                if ( empty )
                                {
                                    setGraphic( null );
                                }
                                else
                                {
                                    // select/unselect the item when checkbox is selected/unselected
                                    checkBox.selectedProperty().addListener( new ChangeListener<Boolean>()
                                    {
                                        @Override
                                        public void changed( ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue )
                                        {
                                            getTableView().requestFocus();
                                            if ( newValue )
                                            {
                                                getTableView().getSelectionModel().select( getIndex() );
                                                list.add( item );
                                            }
                                            else
                                            {
                                                getTableView().getSelectionModel().clearSelection( getIndex() );
                                                list.remove( item );
                                            }
                                        }
                                    } );

                                    // select/unselect the checkbox when the tablerow is selected/unselected
                                    if ( getTableRow() != null )
                                    {
                                        getTableRow().selectedProperty().addListener( new ChangeListener<Boolean>()
                                        {
                                            @Override
                                            public void changed( ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue )
                                            {
                                                checkBox.setSelected( newValue );
                                                if ( newValue )
                                                {
                                                    list.add( item );
                                                }
                                                else
                                                {
                                                    list.remove( item );
                                                }
                                            }
                                        } );
                                    }
                                    setGraphic( checkBox );
                                }
                            }
                        };
                    }
                } );

        TableColumn firstNameCol = new TableColumn( "First Name" );
        firstNameCol.setMinWidth( 100 );
        firstNameCol.setCellValueFactory( new PropertyValueFactory<>( "firstName" ) );

        TableColumn lastNameCol = new TableColumn( "Last Name" );
        lastNameCol.setMinWidth( 100 );
        lastNameCol.setCellValueFactory( new PropertyValueFactory<>( "lastName" ) );

        table.setItems( data );
        table.getColumns().addAll( selectCol, firstNameCol, lastNameCol );

        (( Group ) scene.getRoot()).getChildren().addAll( new VBox( table ) );

        stage.setScene( scene );
        stage.show();
    }


    public static class Person
    {

        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;


        private Person( String fName, String lName )
        {
            this.firstName = new SimpleStringProperty( fName );
            this.lastName = new SimpleStringProperty( lName );
        }


        public String getFirstName()
        {
            return firstName.get();
        }


        public void setFirstName( String fName )
        {
            firstName.set( fName );
        }


        public String getLastName()
        {
            return lastName.get();
        }


        public void setLastName( String fName )
        {
            lastName.set( fName );
        }

    }

}
 类似资料:
  • 我已经设法让我的应用程序在复选框状态更改时更新数据库,但当我滚动应用程序时,复选框的状态会更改。 我的问题是:如何保存复选框的状态,以便在滚动视图时它们不会更改? 这是我的光标适配器。

  • 我的TableView包含一些数字数据。当我说按按钮编辑值时,它会将单元格的背景更改为绿色。当没有足够的行使表格可滚动时,这种方法很有效。一旦表格变成(或从一开始就是)可滚动的,它就会开始表现出怪异的行为。它会更改已编辑项目的背景,但也会更改在向下滚动之前不可见的项目的背景。然而,当我调试时,更改背景的代码只被调用一次。我认为它与tableview有关,当is scrollable破坏并重新创建单

  • 我的ListView自定义适配器(及其新实现的viewHolder)有一些问题。我有一个列表视图,每个项目都有一个复选框(这里没有新内容)。问题是,如果我的列表中有超过9个项目,当我选中第一个复选框时,第十个将自动选中(第二个与第十一个相同),就像两个项目都有一个监听器一样(我认为在某种程度上是这样)。 我在这里读到了listView、视图回收和ViewHolder解决它的方法的位置问题:如何使我

  • 我正在开发一个聊天应用程序。我有一个聊天活动,两个用户可以发送WhatsApp之类的消息,但我有个问题。 就像你在图中看到的(https://ibb.co/3cyYX01),滚动时视图乱糟糟的,我想我知道为什么了。 在查看了这些帖子后:RecyclerView在滚动时出错,Android:RecyclerView在滚动后内容出错 我假设问题可能出在函数中的回收器视图适配器中,因为我在某些视图(VI

  • 问题内容: 在这个项目中,我无法在控制台输出中获取是否选择了Checkbox数据。 我的代码: 它给我的输出像 但是它并不能告诉天气复选框是否处于选中状态: 我需要这样的输出: 要么 问题答案: 在以下情况下尝试此操作: 请注意 ,仅当播放器受伤时才会显示输出,否则将为空白: 选定的行:Gareth Bale(受伤) 选定的行:Gareth Bale 替换为: 选择的行:Gareth Bale t

  • 我知道有许多解决方案可以解决这个问题,但我并不是解决这个问题的正确方法,当一个复选框被选中时,我会为它分配一个ID,并将其添加到一个数组中,但当向下滚动时,该复选框被取消选中,但ID存储在数组中,如果它被选中,我希望它保持选中状态。 我的适配器类是。