java - 如何在 JavaFX 上使用 checkBox 选择行?

标签 java javafx checkbox tableview fxml

我正在使用 JavaFx,我有一个用 sceneBuilder 创建的 TableView ,它包含 3 列,其中一列用于 checkBoxes ,还有一个名为 print_tab 的按钮,当我点击这个按钮时,我想得到 用 checkBox 选择的行 -> true 但我不知道该怎么做:

我读了很多关于 callBack the table column of checkbox 的例子,但不知道该怎么做。

这是 Controller :

    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.geometry.Insets;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.CheckBox;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.CheckBoxTableCell;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    import javafx.stage.StageStyle;
    import javafx.util.Callback;


     public class RecapController implements Initializable{

     @FXML
     private TableView<OMission> missionTable;

    @FXML
    private TableColumn<OMission, Boolean> checkedCol; 

      private ObservableList<OMission> UserMission = 
 FXCollections.observableArrayList();
    
      private OMission mission=null;
    
    
    
    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {
        
         
         
         try {
            load_recap();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
         
    }

    public void load_recap(){
    

      .....

     
    checkedCol.setCellFactory(
                                CheckBoxTableCell.forTableColumn(checkedCol)
                            );
                        
    checkedCol.setCellValueFactory(new PropertyValueFactory<>("remark"));

                    checkedCol.setEditable(true);


          }


    public void print_tab() throws Exception {

                  // here is the method that the button calls , i want to get here the selected rows with checkbox -> true                  

                  }

          }

在类模型上我有这段代码:

    public class OMission {

         private String ObjMission ;
         private Boolean remark;

         public OMission(  String objMission ) {

                 This.objMission = ObjMission ;

                 remark = false;
                           
                                    }

        public Boolean getRemark() {
            return remark;
        }

        public void setRemark(Boolean remark) {
            this.remark = remark;
        }


        public String getObjMission() {
            return ObjMission;
        }



        public void setObjMission(String objMission) {
            ObjMission = objMission;
        }

fxml代码:

<?xml version="1.0" encoding="UTF-8"?>

<?import com.jfoenix.controls.JFXButton?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane fx:id="pan" prefHeight="740.0" prefWidth="1258.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.RecapController">
   <children>
      <JFXButton layoutX="16.0" layoutY="22.0" onAction="#OpenMission" style="-fx-background-color: #0A4969;" text="Ajouter une nouvelle mission : " textFill="WHITE">
         <font>
            <Font size="14.0" />
         </font>
      </JFXButton>
      <TableView fx:id="missionTable" layoutX="16.0" layoutY="64.0" prefHeight="659.0" prefWidth="1226.0">
                    <columns>
                      <TableColumn prefWidth="612.5" text="RAPPORT DE MISSION">
                           <columns>
                                
                              
                              <TableColumn fx:id="local" prefWidth="100.0" text="Localité" />
                              <TableColumn fx:id="objmission" prefWidth="243.0" text="Objet Mission" />
                              
                           </columns>
                        </TableColumn>
                    
            <TableColumn fx:id="checkedCol"  prefWidth="75.0" text="select" /> // That's the button i want to click on 
                    </columns>
                  </TableView>
      <JFXButton layoutX="263.0" layoutY="25.0" onAction="#print_tab" text="print" />
      <CheckBox fx:id="SelectAll" layoutX="1154.0" layoutY="41.0" mnemonicParsing="false" text="Select All" />

   </children>
    

有什么想法吗?

编辑:

public void print_tab() throws Exception {

         for(OMission bean : UserMission)
    {
        System.out.println(bean.getRemark()); // always getting false
        if(bean.getRemark()) {
            
            System.out.println(bean.getObjMission());
        }
    }                         

                  }

我试过这种方式,但即使我选中了一些复选框,我总是得到 false not true,知道吗?同时我认为迭代所有集合不是一件好事...

最佳答案

我会在 OMission 类中实现 FX 属性模式:

public class OMission {

    private final StringProperty objMission = new SimpleStringProperty(this, "objMission");
    private final BooleanProperty remark = new SimpleBooleanProperty(this, "remark");

    public OMission(String objMission) {
        this.objMission.set(objMission);
        this.remark.set(false);
    }

    public StringProperty objMissionProperty() {
        return objMission;
    }

    public String getObjMission() {
        return objMissionProperty().get();
    }

    public void setObjMission(String objMission) {
        objMissionProperty().set(objMission);
    }

    public BooleanProperty remarkProperty() {
        return remark;
    }

    public Boolean getRemark() {
        return remarkProperty().get();
    }

    public void setRemark(Boolean remark) {
        remarkProperty().set(remark);
    }
}

然后你可以替换CellValueFactory列:

checkedCol.setCellValueFactory(new PropertyValueFactory<>("remark"));

与:

checkedCol.setCellValueFactory(cellData -> cellData.getValue().remarkProperty());

关于java - 如何在 JavaFX 上使用 checkBox 选择行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69155467/

相关文章:

javascript - 从 Javascript 中的复选框值向字段添加/删除值

java - 使用蓝牙接入点检测位置

没有年份的 JavaFX DatePicker : can it be Day and Month only,?

javafx - 在javafx中设置字体

java - 如何将操作监听器添加到平铺 Pane 中的各个元素

css - 自定义 Bootstrap 复选框

java - 在 IntelliJ IDEA 中使用模块

java - 适用于低带宽的 RMI - 替代方案?

java - 如何在lucene中为具有多个值的数字字段正确创建范围查询

javascript - AngularJS 使用 ngModel 从 Checkbox 集中获取复杂对象