JavaFX过滤器实现(如何处理多个布尔选项)
我正在使用JavaFX,我想实现一个过滤器来访问数据库中的数据。根据选中的复选框,我希望执行特定的sql语句从数据库检索数据。问题是,如果我添加多个过滤器,我不知道如何管理它们。我不想为每个组合写不同的选择,因为有太多了。 我觉得这是个逻辑问题。有没有办法以某种方式存储这些复选框,然后方便地检查它们是否被选中。基于此,我希望能够构造sql语句来检索我想要的数据JavaFX过滤器实现(如何处理多个布尔选项),java,javafx,filter,tablefilter,Java,Javafx,Filter,Tablefilter,我正在使用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();
}