Java 简单的事情。
1)制作CheckBoxCellFactory类。在您的项目中放置一个位置。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
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
}
}