2014-03-04 4 views
2

Я хотел бы отображать только определенную информацию в виде таблицы, например, только «мужские» люди в базе данных. Я использую только javafx. Заранее благодарны за Вашу помощь.Фильтрация данных для отображения из базы данных в javafx

Это моя текущая таблица enter image description here

Я хотел бы, чтобы отфильтровать таблицу, так что только строки с «статус заказа: ПЛАТНЫЕ» отображаются в таблице.

+0

Можете ли вы дать нам еще некоторые данные на столе? Согласно вашему текущему вопросу, он легко может быть достигнут из SQL-запроса! – ItachiUchiha

+0

@ItachiUchiha Ive добавил картинку таблицы – Lycon

+0

Это ваш текущий дисплей, вы хотите отфильтровать данные на основе 'ORDER STATUS'? – ItachiUchiha

ответ

3

Если вы можете использовать java 8, вы можете использовать встроенный фильтр FilteredList и предикаты. Вот что я написал для проверки фильтрации регулярных выражений. Я немного изменил его, чтобы больше походить на ваш пример и при необходимости использовать javafx 2.2. Просто изменить некоторые из комментируемых линий использовать Java 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); 
     } 
    } 

} 

TODO, есть предположительно способ связать predicateProperty, но я не могу понять это.

Edit: Если вы хотите привязки, вместо обработчика ActionEvent, сделать что-то вроде

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

@James_D Спасибо, отлично работает. – brian

+0

Меня не интересовало использование связывания предикатов, потому что я беспокоился о производительности, нанесенной при каждом нажатии клавиши. Я просто попробовал его с регулярным выражением на 25000 строк, и это кажется мгновенным. Быстрый взгляд на cpus показывает меньшее использование, чем просто выключение на стадии javafx. – brian

+0

Способ, которым он работает (я считаю), заключается в том, что при каждом нажатии клавиши свойство предиката изменяется, что просто приводит к тому, что свойство элементов помечено как недействительное. Затем на каждом рендере кадра, который наблюдает за недопустимым свойством, он будет перекомпилировать отфильтрованный список и отображаемые ячейки. Таким образом, независимо от того, как быстро вы набираете, совпадения регулярных выражений выполняются не чаще одного раза за кадр, т. Е. 60 раз в секунду, что больше, чем простое время для большинства систем для вычисления 25 000 регулярных выражений. –

2

Если вы используете Javafx 2.0+, вам необходимо написать собственный пользовательский фильтр представления таблиц, или вы можете использовать javafx_filterable_columns. Для пользовательских настольных фильтров, вы можете по этой ссылке, которая обеспечивает очень хороший подход к написанию фильтров

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

В Javafx8, может быть объект встроен. Но я не уверен, так как я никогда не использовал его лично!

Смежные вопросы