2016-04-09 10 views
0

Ich arbeite mit JavaFX und ich möchte einen Filter für den Zugriff auf Daten aus einer Datenbank implementieren. Je nachdem, welche Kontrollkästchen aktiviert sind, möchte ich eine bestimmte SQL-Anweisung ausführen, um Daten aus meiner Datenbank abzurufen. Das Problem ist, dass ich, wenn ich mehrere Filter hinzufüge, nicht weiß, wie man sie verwaltet. Ich möchte keine andere Auswahl für jede Kombination schreiben, weil es zu viele gibt. enter image description hereJavaFX-Filter-Implementierung (Wie mehrere boolesche Optionen zu behandeln)

Ich fühle mich wie ein logisches Problem ist. Gibt es eine Möglichkeit, diese Kontrollkästchen irgendwie zu speichern und dann einfach zu überprüfen, ob sie ausgewählt sind oder nicht, und basierend darauf, möchte ich in der Lage sein, die SQL-Anweisung zu konstruieren, um die gewünschten Daten wiederherzustellen.

Ich brauche nur eine Idee von Anfang, kein Codebeispiel, vielleicht von jemandem, der dies auf einer Website implementiert.

Antwort

0

Hier ist eine Möglichkeit: Verwenden Sie Binär, behandeln Sie jede Option ein wenig und erhalten Sie einzigartige Status. Ein sehr einfaches Beispiel (beachten Sie, dass dieses Beispiel nicht eine gute Umsetzung ist es nur eine Demonstration einer möglichen Annäherung.):

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

    } 


Ouput Beispiele:
false false false = 0
false true false = 2
true true true = 7

Eine mögliche Implementierung der Idee der oben demonstriert:

/** 
    *<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); 
    } 
0

Sie könnten speichern die CheckBox es in einem Array und Function<Boolean, String> in einem anderen Array/List, Verwendung Ströme aus CheckBox Zustand abzubilden und Collectors.joining eine Abfrage zu erzeugen, verwenden zu konditionieren.

Beispiel:

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