Java 简单的事情。

Java 简单的事情。,java,javafx,javafx-2,Java,Javafx,Javafx 2,1)制作CheckBoxCellFactory类。在您的项目中放置一个位置。 public class CheckBoxCellFactory implements Callback { @Override public TableCell call(Object param) { CheckBoxTableCell<Person,Boolean> checkBoxCell = new CheckBoxTableCell(); retu

1)制作CheckBoxCellFactory类。在您的项目中放置一个位置。

public class CheckBoxCellFactory implements Callback {
    @Override
    public TableCell call(Object param) {
        CheckBoxTableCell<Person,Boolean> checkBoxCell = new CheckBoxTableCell();
        return checkBoxCell;
    }
}
public static class Person {
   private SimpleBooleanProperty checked = new SimpleBooleanProperty(false);
   // other columns here

    public SimpleBooleanProperty checkedProperty() {
        return this.checked;
    }

    public java.lang.Boolean getChecked() {
        return this.checkedProperty().get();
    }

    public void setChecked(final java.lang.Boolean checked) {
        this.checkedProperty().set(checked);
    }

    // getter/setter for other columns

}
3)在fxml文件中进行了修改。TableView->TableColumn的部分将如下所示:

<TableColumn fx:id="checkBoxTableColumn" maxWidth="34.0" minWidth="26.0" prefWidth="34.0" resizable="false" sortable="false">   
<cellValueFactory><PropertyValueFactory property="checked" /></cellValueFactory>
<cellFactory><partarch.fx.CheckBoxCellFactory /></cellFactory>
</TableColumn>

4)如果要使复选框可编辑

  • 4.1在场景生成器中打开fxml
  • 4.2选择复选框列,然后在属性窗格中选中“可编辑”属性
  • 4.3选择包含复选框的TableView并执行相同操作(在属性窗格中选中“可编辑”属性)

在上的二进制文件和上的源代码中实现有点离题-但在Kotlin中,您可以这样做:

    isPvtColumn.cellFactory = Callback { CheckBoxTableCell<KeyWithProperties, Boolean>() }

    isPvtColumn.cellValueFactory = Callback {
        a -> a.value.private
    }
isPvtColumn.cellFactory=回调{CheckBoxTableCell()}
isPvtColumn.cellValueFactory=回调{
a->a.value.private
}

这就是全部内容

在初始化方法中,将自定义工厂切换为JavaFX提供的工厂:

@Override
public void initialize(URL arg0, ResourceBundle arg1) {

     ObservableList<TestObject> data = FXCollections.observableArrayList();
     data.add(new TestObject("Test 1", true));
     data.add(new TestObject("Test 2", false));

     tableReport.setItems(data);

     name.setCellValueFactory(new PropertyValueFactory<TestObject, String>("name"));
     checkbox.setCellValueFactory(new PropertyValueFactory<TestObject, Boolean>("checked"));

     checkbox.setCellFactory(
         CheckBoxTableCell.forTableColumn(checkbox)
     );

}
@覆盖
公共void初始化(URL arg0,ResourceBundle arg1){
ObservableList data=FXCollections.observableArrayList();
添加(新的TestObject(“test1”,true));
添加(新的TestObject(“test2”,false));
tableReport.setItems(数据);
名称。setCellValueFactory(新属性ValueFactory(“名称”);
复选框.setCellValueFactory(新属性ValueFactory(“选中”);
checkbox.setCellFactory(
CheckBoxTableCell.forTableColumn(复选框)
);
}
现在,您的数据已绑定到列,您可以迭代项目并检查“已检查”字段:

@FXML
public void getValues(){
ObservableList data=tableReport.getItems();
用于(TestObject项:数据){
//检查每个项目的布尔值以确定复选框状态
}
}

Duplicate-Noo,也就是在JavaSwing中。我的应用程序使用javaFX。这里有很多不同。下面的gotozero回答对我来说很有效,并且花了大约一分钟的时间来实现。如果使用fxml,则无需更改代码。如果要检查子类,可以使用
if(BooleanProperty.class.isAssignableFrom(myObject.getClass())
尝试了该操作,但布尔值未映射到复选框。不知道为什么和如何。(虽然我将布尔值设置为“true”,但它没有选中复选框)不起作用。当用户单击复选框时,复选框本身会发生更改,但该值不会传递给model@Mateus维卡里,你可以看看这里@gotozero这个答案对我来说一字不差(我所做的只是按照你的指示去做,没有别的)。非常感谢gotozero给出的最直接的答案。这确实是正确的答案,值得更多的投票。这个解决方案很好,也很优雅!我想添加一些小注释:您必须在模型中使用BooleanProperty,而不是ObjectProperties,并且您还可以通过在控制器中使用以下更新替换步骤3来避免步骤1:
checkBoxTableColumn.setCellValueFactory(cellData->cellData.getValue().checkedProperty());setCellFactory(参数->新建CheckBoxTableCell())有3个不同的回调间隔。我应该实现哪一个?不要只是贴一堵没有任何解释的代码墙Orry@StealthRabbi我的英语很差,所以我的代码中没有任何解释。。。。在这之后,我会写一个解释。谢谢你的建议…对我很有用,因为我在别处找不到这个信息
@FXML
public void getValues(){        
    ObservableList<TestObject> data = tableReport.getItems();

    for (TestObject item : data){
        //check the boolean value of each item to determine checkbox state
    }
}
public static class Member {
    private StringProperty myName;
    private BooleanProperty myCheck;

    public Member(String name, boolean checked) {
        myName = new SimpleStringProperty(name);
        myCheck = new SimpleBooleanProperty(checked);
    }

    public StringProperty nameProperty() { return myName; }    
    public BooleanProperty checkProperty() { return myCheck; }
}

VBox testTable6(VBox box) { // check box bind to cell property
    ObservableList<Member> members = FXCollections.observableArrayList();

    members.add(new Member("peter", true));
    members.add(new Member("gernot", true));
    members.add(new Member("fritz", false));

    TableView<Member> table = new TableView<Member>();
    table.prefHeightProperty().bind(box.heightProperty());
    table.setItems(members);

    TableColumn<Member,String> c1 = new TableColumn<Member,String>("Name");
    c1.setCellValueFactory(new PropertyValueFactory<Member,String>("name"));
    table.getColumns().add(c1);

    TableColumn<Member,Boolean> c2 = new TableColumn<Member,Boolean>("Membercheck");
    c2.setCellValueFactory(new PropertyValueFactory<Member,Boolean>("check"));
    c2.setCellFactory(column -> new TableCell<Member, Boolean>(){
        public void updateItem(Boolean check, boolean empty) {
            super.updateItem(check, empty);
            if (check == null || empty) {
                setGraphic(null);
            } else {
                CheckBox box = new CheckBox();
                BooleanProperty checked = (BooleanProperty)column.getCellObservableValue(getIndex());
                box.setSelected(checked.get());
                box.selectedProperty().bindBidirectional(checked);
                setGraphic(box);
            }
        }
    }
            );
    table.getColumns().add(c2);

    box.getChildren().addAll(table);
    return box;
}
...
Member member = table.getItems().get(getIndex());
box.setSelected(member.checkProperty().get());
box.selectedProperty().bindBidirectional(member.checkProperty());
....
box.setSelected(member.checkProperty().get());
public class CheckBoxCellFactory implements Callback {
    @Override
    public TableCell call(Object param) {
        CheckBoxTableCell<Person,Boolean> checkBoxCell = new CheckBoxTableCell();
        return checkBoxCell;
    }
}
public static class Person {
   private SimpleBooleanProperty checked = new SimpleBooleanProperty(false);
   // other columns here

    public SimpleBooleanProperty checkedProperty() {
        return this.checked;
    }

    public java.lang.Boolean getChecked() {
        return this.checkedProperty().get();
    }

    public void setChecked(final java.lang.Boolean checked) {
        this.checkedProperty().set(checked);
    }

    // getter/setter for other columns

}
<TableColumn fx:id="checkBoxTableColumn" maxWidth="34.0" minWidth="26.0" prefWidth="34.0" resizable="false" sortable="false">   
<cellValueFactory><PropertyValueFactory property="checked" /></cellValueFactory>
<cellFactory><partarch.fx.CheckBoxCellFactory /></cellFactory>
</TableColumn>
    isPvtColumn.cellFactory = Callback { CheckBoxTableCell<KeyWithProperties, Boolean>() }

    isPvtColumn.cellValueFactory = Callback {
        a -> a.value.private
    }
@Override
public void initialize(URL arg0, ResourceBundle arg1) {

     ObservableList<TestObject> data = FXCollections.observableArrayList();
     data.add(new TestObject("Test 1", true));
     data.add(new TestObject("Test 2", false));

     tableReport.setItems(data);

     name.setCellValueFactory(new PropertyValueFactory<TestObject, String>("name"));
     checkbox.setCellValueFactory(new PropertyValueFactory<TestObject, Boolean>("checked"));

     checkbox.setCellFactory(
         CheckBoxTableCell.forTableColumn(checkbox)
     );

}
@FXML
public void getValues(){        
    ObservableList<TestObject> data = tableReport.getItems();

    for (TestObject item : data){
        //check the boolean value of each item to determine checkbox state
    }
}