Filter in Tabelle Sql

dior

Bekanntes Mitglied
Hi,
Ich befalle eine Tabelle aus einer Sql Oracle Abfrage.

Kann mir jemand zeigen wie ich jetzt die Ergebnisse Filtern kann?
Ich habe schon alle möglichen Seiten und Beispiele angesehen und Herumprobieren aber ich komme einfach nicht zurecht.

Ich will im Textfeld zu schreiben beginnen und die Tabelle soll entsprechend aktualisiert werden.

Danke im voraus

Java:
package FX;

import java.sql.Connection;
import java.sql.ResultSet;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.collections.transformation.SortedList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.CustomMenuItem;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
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.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;
import static org.openxmlformats.schemas.drawingml.x2006.main.STPercentage.Factory.newValue;


public class TestJavaFXWindow extends Application {

    //TABLE VIEW AND DATA
    private ObservableList<ObservableList> data;
    private TableView tableview;
    private TextField filterField;
    private TableColumn<selectResult, String> FID;
    private TableColumn<selectResult, String> NAME;

    @Override
    public void start(final Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Open a New Window");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                //TableView
                filterField = new TextField();
                tableview = new TableView();
                buildData();
              //  Label secondLabel = new Label("Hello");

                StackPane secondaryLayout = new StackPane();

                secondaryLayout.getChildren().add(tableview);
             //   secondaryLayout.getChildren().add(secondLabel);
                secondaryLayout.getChildren().add(filterField);

                Scene secondScene = new Scene(secondaryLayout, 1024, 768);

                Stage secondStage = new Stage();
                secondStage.setTitle("Second Stage");
                secondStage.setScene(secondScene);

                //Set position of second window, related to primary window.
                secondStage.setX(primaryStage.getX() + 250);
                secondStage.setY(primaryStage.getY() + 100);

                secondStage.show();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("java-buddy.blogspot.com");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    //CONNECTION DATABASE
    public void buildData() {
        Connection c;
        data = FXCollections.observableArrayList();
        try {
            c = Stromobjekte._DB_Connection.getConnection();
            //SQL FOR SELECTING ALL OF CUSTOMER

            String SQL = "SELECT FID, NUM from liste WHERE ID in (605088550,605088781,605088643,605004445,400021214,400021218)";
            //ResultSet
            ResultSet rs = c.createStatement().executeQuery(SQL);
TableColumn col;
            /**
             * ********************************
             * TABLE COLUMN ADDED DYNAMICALLY * ********************************
             */
            for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
                //We are using non property style for making dynamic table
                final int j = i;
                 col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
                col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
                    public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {
                        return new SimpleStringProperty(param.getValue().get(j).toString());
                    }
                });

                tableview.getColumns().addAll(col);
                System.out.println("Column [" + i + "] ");
            }
      
          
      
  /**
             * ******************************
             * Data added to ObservableList * ******************************
             */
 
            while (rs.next()) {
                //Iterate Row
                ObservableList<String> row = FXCollections.observableArrayList();
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                    //Iterate Column
                    // row.add(rs.getString(i));
                    Object o = rs.getObject(i);
                    row.add(o == null ? "" : o.toString()); // wenn ein NULL Value gefunden wird, wird dieser durch "" ersetzt
                }
                System.out.println("Row added " + row);
                //System.out.println("Row [fid] " + row.get(3));
                data.add(row);
               
            }

            //FINALLY ADDED TO TableView
            tableview.setItems(data);

            TextField textField = new TextField();


        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error on Building Data");
        }
    }

}
 
... wenn aktuell auch nur sehr langsam und für kleinere Datenmengen.

Tipp: Dynamisch nachladen 😉
Dein Bildschirm wird dir wahrscheinlich nie alle Datensätze auf einmal anzeigen können, lade daher im ersten Schub nur soviele wie du sehen könntest + einige mehr.
Wenn der User scrollt werden die nächsten X geladen usw.
Vorteil: Es werden auch nur Daten geladen welche dem User auch gezeigt werden. Scrollst du bei einer Liste von 1000 Einträgen nur 100 durch, sind 900 umsonst geladen worden.
Nachteil: Je nach Daten und Umfang der Darstellung kann es hier natürlich zu "Hängern" kommen da das nachladen vielleicht zulange dauert. Hier müsste man eben etwas mehr vorladen um einen gewissen Buffer zu haben, dann wirkt es flüssig.
 
Oder So etwas wie den Umfang der Liste zuerst holen und mit Dummies füllen... Würde das etwas bringen? Und dann Jooses Idee folgend die Dumies gegen die echten Daten austauschen, wenn du dort angekommen bist.
In SWT gibt es das Feature der virtuellen Tabellen, das bei grossen Mengen zum Tragen kommt, weiss jetzt nicht genau, wie es bei JavaFX ist.

Beispiele für "JavaFX virtual tableview":
http://stackoverflow.com/questions/33005555/javafx-virtual-table-view
 
Ich habe beim Entwickler von ControlsFX nachgefragt.

I have made some substantial improvements in a pull request this week and overhauled the backing engine to support a high volume of records. I even added listeners for cell value changes.

Feel free to watch (or even use) this PR and it should be in the next release.

https://bitbucket.org/controlsfx/co...r-performance-optimizations/diff#comment-None

Ich werde einfach ein bisschen warten bis ich die neue Version habe. 🙂

Danke für eure Hilfe
 

Zurück
Oben