2016-04-09 12 views
0

JavaFX ile çalışıyorum ve veri tabanından veri elde etmek için bir filtre uygulamak istiyorum. Hangi onay kutularının seçildiğine bağlı olarak, veritabanımdan veri almak için belirli bir sql ifadesini çalıştırmak istiyorum. Sorun şu ki, birden fazla filtre eklerseniz bunları nasıl yöneteceğimi bilmiyorum. Her kombinasyon için farklı bir seçim yazmak istemiyorum, çünkü çok fazla var. enter image description hereJavaFX filtre uygulaması (Birden çok Boole seçeneği nasıl kullanılır)

Mantıksal bir problem gibi hissediyorum. Bu onay kutularını bir şekilde saklamak için bir yol var mı ve sonra bunların seçilip seçilmediğini kontrol etmenin bir yolu var mı, buna dayanarak, istediğim verileri geri almak için sql ifadesini yapılandırabiliyorum.

Bir kod örneğine, belki de bunu bir web sitesinde uygulayan birinden başlamak için bir ideea'ya ihtiyacım var.

cevap

0

Bunu yapmanın bir yolu şöyledir: ikili kullan, her seçeneğe biraz davran ve benzersiz durumlara sahip ol. Çok basit bir örnek (bu örnek iyi bir uygulama olmadığına dikkat Muhtemel bir yaklaşımın sadece bir tanıtımdır.):

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

    } 


Çıkışı örnekler:
false false = 0
false false true = 2
true true = 7

yukarıda gösterildiği fikrin olası bir uygulaması:

/** 
    *<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

Bir dizide CheckBox es ve başka bir dizide Function<Boolean, String> depolayabilir veya CheckBox durumundan eşleştirmek için akışları kullanın ve bir sorgu oluşturmak için Collectors.joining kullanın.

Örnek:

@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(); 
} 
İlgili konular