2017-04-11 38 views
0

我有一個程序,用於搜索可觀察列表並顯示錶上的所有匹配案例。搜索工作正常,但我只能運行該程序的這一部分一次。程序返回到顯示完整的可觀察列表後,搜索按鈕停止響應。可重複使用的搜索功能javafx

我有一個單獨的類(Search.class),它處理搜索可觀察列表的所有邏輯。

的搜索按鈕和文本字段的代碼都低於:

partSearchBtn.setOnAction(searchPartEvent ->{ 
    ObservableList<Part> searchPartDisplay = FXCollections.observableArrayList(); 

    String searchQuery = partSearchField.getText(); 

    try{ 
     searchPartDisplay = Search.searchPartByNumber(Integer.parseInt(searchQuery)); 
     partTable.setItems(searchPartDisplay); 

     partSearchBtn.setText("Clear"); 
     partSearchBtn.setOnAction(clearSearchEvent ->{ 
      partSearchBtn.setText("Search"); 
      partTable.setItems(Inventory.partBin); 
     }); 

    } catch(NumberFormatException hasText){ 
     searchPartDisplay = Search.searchPartByText(searchQuery); 
     partTable.setItems(searchPartDisplay); 

     partSearchBtn.setText("Clear"); 
     partSearchBtn.setOnAction(clearSearchEvent ->{ 
      partSearchBtn.setText("Search"); 
      partTable.setItems(Inventory.partBin); 
     }); 
    } 
}); 

我需要什麼樣的變化,使重新運行搜索過程? 或者我應該把它變成一個方法作爲我的搜索類的一部分,我可以重用?

的搜索邏輯低於:

package inventorymngmnt; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

public class Search { 

    public static ObservableList<Part> searchPartByNumber(int inNum){ 
     ObservableList<Part> searchBin = FXCollections.observableArrayList(); 
     for(Part e: Inventory.partBin){ 

      boolean typeCaseIn = (e.getClass() == Inhouse.class);    
      if(typeCaseIn == true){ 
       Inhouse testIn = (Inhouse) e; 
       if(inNum == testIn.getMachineID()) 
        searchBin.add(e); 
      } 
      if((inNum == e.getPartID()) || (inNum == e.getInstock()) || (inNum == e.getMax()) 
        || (inNum == e.getMin()) || ((double)inNum == e.getPrice()) 
        || (Integer.toString(inNum).contains(e.getName()))){ 
       searchBin.add(e); 
      } 
     } 
     return searchBin; 
    } 

    public static ObservableList<Part> searchPartByText(String inString){ 
     ObservableList<Part> searchBin = FXCollections.observableArrayList(); 
     for(Part e: Inventory.partBin){ 
      boolean typeCaseOut = (e.getClass() == Outsourced.class); 
      if(typeCaseOut == true){ 
       Outsourced testOut = (Outsourced) e; 
       if(inString.equals(testOut.getCompanyName())){ 
        searchBin.add(e); 
       } 
      } 
      if(inString.equals(e.getName())){ 
       searchBin.add(e); 
      } 
     }   
     return searchBin; 
    } 

    public static ObservableList<Part> searchProdByNumber(int inNum){ 
     ObservableList<Part> searchProd = FXCollections.observableArrayList(); 
     for(Part e: Inventory.partBin){ 

      boolean typeCaseIn = (e.getClass() == Inhouse.class);    
      if(typeCaseIn == true){ 
       Inhouse testIn = (Inhouse) e; 
       if(inNum == testIn.getMachineID()) 
        searchProd.add(e); 
      } 
      if((inNum == e.getPartID()) || (inNum == e.getInstock()) || (inNum == e.getMax()) 
        || (inNum == e.getMin()) || ((double)inNum == e.getPrice()) 
        || (Integer.toString(inNum).equals(e.getName()))){ 
       searchProd.add(e); 
      } 
     } 
     return searchProd; 
    } 

    public static ObservableList<Part> searchProdByText(String inString){ 
     ObservableList<Part> searchProd = FXCollections.observableArrayList(); 
     for(Part e: Inventory.partBin){ 
      boolean typeCaseOut = (e.getClass() == Outsourced.class); 
      if(typeCaseOut == true){ 
       Outsourced testOut = (Outsourced) e; 
       if(inString.equals(testOut.getCompanyName())){ 
        searchProd.add(e); 
       } 
      } 
      if(inString.equals(e.getName())){ 
       searchProd.add(e); 
      } 
     }   
     return searchProd; 
    } 
} 
+0

當你清除搜索,該處理器的OnAction仍設置清除搜索... –

回答

0

它不工作,因爲當你清除搜索,按鈕上的動作仍設置爲清除搜索...

考慮完全不同的策略。您可以使用FilteredList作爲表格的列表。然後,只需切換列表中的謂語:

Predicate<Part> noFilter = part -> true; 
FilteredList<Part> filteredParts = new FilteredList<>(Inventory.partBin, noFilter); 
partTable.setItems(filteredParts); 

partSearchBtn.setOnAction(searchPartEvent -> { 
    if (filteredParts.getPredicate()==noFilter) { 
     String searchQuery = partSearchField.getText(); 
     try { 
      int searchNumber = Integer.parseInt(searchQuery); 
      filteredParts.setPredicate(part -> Search.filterByNumber(part, searchNumber)); 
     } catch (NumberFormatException exc) { 
      filteredParts.setPredicate(part -> Search.filterByText(part, searchQuery)); 
     } 
    } else { 
     filteredParts.setPredicate(noFilter); 
    } 
}); 

partSearchButton.textProperty().bind(Bindings 
    .when(filteredParts.predicateProperty().isEqualTo(noFilter)) 
    .then("Search") 
    .otherwise("Clear")); 

public class Search { 

    public static boolean filterByNumber(Part part, int number) { 
     if (part.getClass() == Inhouse.class) { 
      Inhouse testIn = (Inhouse) part ; 
      if (testIn.getMachineID() == number) { 
       return true ; 
      } 
     } 
     if((number == part.getPartID()) || (number == part.getInstock()) || (number == part.getMax()) 
       || (number == part.getMin()) || ((double) number == part.getPrice()) 
       || (Integer.toString(number).contains(part.getName()))){ 
      return true ; 
     } 
     return false ; 
    } 

    public static boolean filterByText(Part part, String text) { 
     //similarly... 
    } 
}