JavaFX过滤器实现(如何处理多个布尔选项)

JavaFX过滤器实现(如何处理多个布尔选项),java,javafx,filter,tablefilter,Java,Javafx,Filter,Tablefilter,我正在使用JavaFX,我想实现一个过滤器来访问数据库中的数据。根据选中的复选框,我希望执行特定的sql语句从数据库检索数据。问题是,如果我添加多个过滤器,我不知道如何管理它们。我不想为每个组合写不同的选择,因为有太多了。 我觉得这是个逻辑问题。有没有办法以某种方式存储这些复选框,然后方便地检查它们是否被选中。基于此,我希望能够构造sql语句来检索我想要的数据 我只需要一个想法开始,而不是一个代码示例,可能是某个在网站上实现此功能的人的想法。有一种方法可以做到这一点:使用二进制,稍微处理每个选

我正在使用JavaFX,我想实现一个过滤器来访问数据库中的数据。根据选中的复选框,我希望执行特定的sql语句从数据库检索数据。问题是,如果我添加多个过滤器,我不知道如何管理它们。我不想为每个组合写不同的选择,因为有太多了。

我觉得这是个逻辑问题。有没有办法以某种方式存储这些复选框,然后方便地检查它们是否被选中。基于此,我希望能够构造sql语句来检索我想要的数据


我只需要一个想法开始,而不是一个代码示例,可能是某个在网站上实现此功能的人的想法。

有一种方法可以做到这一点:使用二进制,稍微处理每个选项并获得唯一的状态。一个非常简单的例子说明这个例子不是一个好的实现。这只是一个可能方法的演示:

    public static void main(String[] args)  {

        //each booleans represents an option (the state of one check box )
        //this example simulates 3 options 
        boolean option1 = true;
        boolean option2 = true;
        boolean option3 = true;

        //represent each boolean as binary (0 or 1 ) string
        String binString1 = (option1) ? "1" : "0";
        String binString2 = (option2) ? "1" : "0";
        String binString3 = (option3) ? "1" : "0";

        //add all strings to one word 
        String binaryAsString = binString1+binString2+binString3;

        //phrase it to int 
        // Use as radix 2 because it's binary
        int number = Integer.parseInt(binaryAsString, 2);

        //for 3 options (bits) you will get 8 different values, from 
        //0 (all false) to 7 (all true)
        System.out.println(option1 + " "+ option2 + " "+ option3 + " = "+ number);

    }
输出示例: 假假=0 假真假=2 真=7

上述想法的一种可能实现方式:

     /**
     *<pre>
     * Converts an array of booleans, in the ordered entered, to a binary word,
     * where each boolean represents one bit. The binary word is returned as int.
     * <br>usage example:
     * <br>   boolToInt(false,true,false) returns 2(binary 010).
     * <br>   boolToInt(true,true,false)  returns 6(binary 110).
     *
     *@param bols
     *@throws IllegalArgumentException if bols is null or empty.
     *@return
     *<pre>
     */
    private static int boolToInt(boolean ... bols) {

        if((bols == null) || (bols.length == 0)) {
            throw new IllegalArgumentException("Invalid (null or empty )input" );
        }

        StringBuilder sb = new StringBuilder();

        for( boolean b : bols) {
            sb.append( (b) ?   "1" : "0"  );
        }

        return Integer.parseInt(sb.toString(), 2);
    } 
您可以将复选框存储在一个数组中,并在另一个数组/列表中运行,使用流将复选框状态映射到条件,并使用Collectors.joining生成查询

例如:

@Override
public void start(Stage primaryStage) {
    CheckBox[] boxes = new CheckBox[]{new CheckBox("a"), new CheckBox("b"), new CheckBox("c")};
    List<Function<Boolean, String>> clausesConstructor = Arrays.asList(
            b -> b ? "a >= 1" : null,
            b -> b ? "b LIKE '%42'" : null,
            b -> b ? "c" : null
    );

    Button btn = new Button();
    btn.setText("Query");
    btn.setOnAction((ActionEvent event) -> {
        List<String> list = IntStream.range(0, boxes.length)
                .mapToObj(i -> clausesConstructor.get(i).apply(boxes[i].isSelected()))
                .filter(Objects::nonNull).collect(Collectors.toList());

        System.out.println(list.isEmpty() ? "SELECT * FROM table" : list.stream().collect(Collectors.joining(") AND (", "SELECT * FROM table WHERE (", ")")));
    });
    VBox vbox = new VBox(10);
    vbox.getChildren().addAll(boxes);
    vbox.getChildren().add(btn);
    Scene scene = new Scene(vbox);

    primaryStage.setScene(scene);
    primaryStage.show();
}