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

如何在JavaFX上使用复选框选择行?

狄誉
2023-03-14

我正在使用JavaFx,我有一个用sceneBuilder创建的表视图,它包含3列,其中一列用于复选框,还有一个名为print\u tab的按钮,我想在单击此按钮时使用复选框选择行-

我读了许多关于回调复选框的表列的示例,但不知道如何做到这一点。

这是控制器:

    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());
        }
    }                         

                  }

我试过这样做,但即使我勾选了一些复选框,我总是得到错误的结果,不是真的,你知道吗?同时,我不认为迭代所有集合是好的。。。

共有2个答案

甄鹏云
2023-03-14

正如这里和这里所建议的,正确定义的属性对于工作表模型至关重要。通过这种方式,按钮处理程序可以遍历表的ObservableList以查找所选行。要单独研究这个问题,请从这个完整的示例开始。以下更改迭代表模型,检查active属性以生成所示的结果:

Button b = new Button("Print Seleceted");
b.setOnAction((ActionEvent e) -> {
    for (Person p : table.getItems()) {
        if (p.active.get()) {
            System.out.println(p.lastName.get() + ": " + p.email.get());
        }
    }
});
vbox.getChildren().addAll(label, table, b);

控制台:

Smith: jacob.smith@example.com
Williams: ethan.williams@example.com
Brown: michael.brown@example.com
洪华皓
2023-03-14

我将在OMis类中实现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());
 类似资料:
  • 问题内容: 我需要有关jQuery选择器的帮助。假设我有一个标记,如下所示: 除了用户单击时,如何获取所有复选框? 问题答案: 一个更完整的示例适用于您的情况: 当被点击复选框,该复选框的状态进行检查,并在当前形式的所有复选框被设置为相同的状态。 请注意,您无需从选择中排除该复选框,因为该复选框的状态将与其他所有复选框相同。如果出于某些原因确实需要排除,则可以使用以下方法:

  • 主要内容:创建一个选择框,示例,实例-2JavaFX选择框允许用户在几个选项之间快速选择。 创建一个选择框 我们可以使用中的构造函数来创建对象。 以下代码显示了如何使用其构造函数创建和填充选择框。 列表项是从可观察的列表来创建的。 我们还可以使用一个空的选择框使用它的默认构造函数,并使用方法设置列表项。 上面的代码还向选择框中添加了一个分隔符对象。分隔符分隔控件项目。 示例 上面的代码生成以下结果。 实例-2 以下代码显示了如何在中填充

  • 主要内容:创建复选框,复选框状态,示例复选框允许用户进行多项选择。例如,当订购披萨时,可以添加多个调味料。单选按钮或切换按钮用于单选或无选择。 创建复选框 我们可以使用中的构造函数来创建的对象。 创建不带标题的复选框,如下代码所示 - 要创建带有字符串标题的复选框,如下代码所示 - 创建复选框后,我们可以更改其文本并将其选中。 复选框状态 可以使用来表示三个状态: Yes No Not Applicable(不适用) “不适用”状态是

  • 我的JavaFx FXML应用程序有问题。 当我在表单上选中复选框时,我想根据单击的复选框执行一个方法。是否有任何方法可以将复选框的名称传递给该方法,以便对其执行一些有条件的工作? 我有两个复选框,只能选择一个。当我单击其中一个时,应取消选择另一个,反之亦然。显然,下面的代码将无法工作,因此我希望传递被单击对象的名称。 任何帮助都将不胜感激,非常感谢。

  • 我想调用一个函数时,选择的任何选项。类似于这样: 但不知何故不起作用。有人能帮忙吗。 请注意 我不想捕获更改事件,如果我选择已经选择选项,则不会触发更改事件

  • 在我的JavaFX应用程序中,我在树形视图中使用复选框来更改节点的可见性。 选中复选框=一些节点可见 取消选中复选框=一些节点是不可见的 但是,在特殊情况下,应提示用户确认其选择,因为激活特定复选框时可能会出现问题。将打开一个对话框窗口,用户可以在其中选择“是”和“否”。如果用户选择“是”,节点将可见,一切正常。但如果用户选择“否”,则应再次取消选中该复选框。 我的想法是检查中的条件(在本例中,在