2014-03-04 3 views
2

데이터베이스의 "남성"사람과 같은 특정 정보 만 테이블보기에 표시하고 싶습니다. 나는 javafx를 사용할 때만이다. 사전에 도움을 주셔서 감사합니다.javafx의 데이터베이스에서 표시 할 데이터 필터링

이 내 현재 테이블 내가 만 열 수 있도록 테이블을 필터링하고 싶은 enter image description here

이다 "주문 상태 : 지불은"표에 표시됩니다.

+0

같은, 대신의 ActionEvent의 핸들러의 결합, 무언가를 원한다면? 현재 질문에 따라 SQL 쿼리에서 쉽게 얻을 수 있습니다! – ItachiUchiha

+0

@ItachiUchiha Ive가 테이블 그림을 추가했습니다. – Lycon

+0

이것이 현재 디스플레이입니다. 'ORDER STATUS'를 기준으로 데이터를 필터링하고 싶습니까? – ItachiUchiha

답변

3

java 8을 사용할 수있는 경우 기본 제공 FilteredList 및 술어를 사용할 수 있습니다. 다음은 정규식 필터링을 테스트하기 위해 작성한 것입니다. 나는 당신의 예제와 더 비슷해지고 필요할 경우 javafx 2.2를 사용하기 위해 약간 수정했다. 그냥 자바에게 8

import javafx.application.Application; 
import javafx.beans.property.DoubleProperty; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.collections.transformation.FilteredList; 
import javafx.event.ActionEvent; 
import javafx.scene.Scene; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.TextField; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class TableTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ObservableList<LineItem> items = FXCollections.observableArrayList(); 
     items.addAll(new LineItem("hello",123.45), 
        new LineItem("paid in full",0.01), 
        new LineItem("paid",0.01), 
        new LineItem("due",0.01), 
        new LineItem("paid",0.01)); 

     //for java8 
     //FilteredList<LineItem> filteredItems = new FilteredList(items, e->true); 

     //not java8 
     ObservableList<LineItem> filteredItems = FXCollections.observableArrayList(items); 

     TableView tableView = new TableView(filteredItems); 

     TableColumn<LineItem,String> descCol = new TableColumn<>("desc"); 
     descCol.setCellValueFactory(new PropertyValueFactory<>("desc")); 

     TableColumn<LineItem, Double> amountCol = new TableColumn<>("amount"); 
     amountCol.setCellValueFactory(new PropertyValueFactory<>("amount")); 

     tableView.getColumns().addAll(descCol,amountCol); 

     TextField filterText = new TextField(); 
     filterText.setPromptText("type filter and press enter"); 
     filterText.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent event) { 
      //normal java8 
      //filteredItems.setPredicate(li -> li.desc.getValue().contains(filterText.getText())); 
      //regex java 8 
      //filteredItems.setPredicate(li -> li.desc.getValue().matches("(?i)"+filterText.getText())); 
      //not javafx 8 
       filteredItems.clear(); 
       for (LineItem li: items) 
        if (li.desc.getValue().contains(filterText.getText())) 
         filteredItems.add(li); 
      } 
     }); 

     VBox root = new VBox(); 
     root.getChildren().addAll(tableView, filterText); 
     Scene scene = new Scene(root, 300, 300); 

     primaryStage.setTitle("Filter table test"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 


    public class LineItem { 

     private final StringProperty desc = new SimpleStringProperty(); 
     private final DoubleProperty amount = new SimpleDoubleProperty(); 

     public StringProperty descProperty() {return desc;} 
     public DoubleProperty amountProperty() {return amount;} 

     public LineItem(String dsc, double amt) { 
      desc.set(dsc); amount.set(amt); 
     } 
    } 

} 

잭을 사용하는 주석 라인의 일부를 변경,이 가정으로 predicateProperty을 결합하는 방법입니다,하지만 난 그것을 알아낼 수 없습니다.

편집 : 당신은 당신이 테이블에 우리에게 좀 더 많은 데이터를 제공 할 수

filteredItems.predicateProperty().bind(
     Bindings.createObjectBinding(() -> 
       li -> li.desc.getValue().contains(filterText.getText()), 
      filterText.textProperty()) 
); 
+0

@James_D 고마워, 잘 작동합니다. – brian

+0

모든 키 누름에서 성능에 대해 걱정했기 때문에 술어 바인딩 사용에 관심이 없었습니다. 난 그냥 25000 라인에 일치하는 정규식으로 시도하고 그것은 순간 보인다. cpus를 잠깐 살펴보면 javafx 스테이지를 마우스로 mousing하는 것보다 적은 용도로 사용할 수 있습니다. – brian

+0

작동 방식 (나는 믿는다)은 모든 키를 누를 때 predicates 속성이 변경되어 items 속성이 유효하지 않은 것으로 표시된다는 결과를 낳습니다. 그런 다음 각 프레임 렌더링에서 잘못된 속성을 관찰하고 필터링 된 목록과 렌더링 된 셀을 다시 계산합니다. 아무리 빨리 입력해도 정규 표현식 검색은 프레임 당 최대 한 번만 수행됩니다. 즉, 초당 60 회입니다. 이는 대부분의 시스템에서 25K 정규 표현식을 계산할 충분한 시간 이상입니다. –

2

Javafx 2.0 이상을 사용하는 경우 사용자 정의 테이블 뷰 필터를 작성하거나 javafx_filterable_columns을 사용할 수 있습니다. 사용자 정의 테이블 필터의 경우, 설비가 붙박이입니다 수 있습니다, 쓰기 필터 Javafx8에서

http://code.makery.ch/blog/javafx-8-tableview-sorting-filtering/

에 아주 좋은 방법을 제공이 링크를 따를 수 있습니다. 그러나, 개인적으로 사용한 적은 한번도 없기 때문에 확실하지 않습니다!

관련 문제