我有一个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);
}
});
下面是如何添加复选框列的完整示例,该复选框列与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存储在数组中,如果它被选中,我希望它保持选中状态。 我的适配器类是。