TableView zeigt keine Daten an

Diskutiere TableView zeigt keine Daten an im Java Basics - Anfänger-Themen Bereich.
J

Joob

Ich habe versucht eine dynamisches TableView nach Beispiel zu erstellen.
Nachdem das mit den Spalten gar nicht funktionierte habe ich diese anders eingegeben, aber die Daten werden nicht angezeigt.

Zur Info:
DATA gibt eine resultset zurück ID , Vorname, Nachname
für die Erstellung habe ich das SQL Statement erst mal im Code definiert, am Ende soll der Inhalt der Tabelle mit dem Textfeld gefiltert werden. Also Zeichenfolge im Vornamen und Nachnamen, aber da bin ja noch nicht.
Ergebnis soll sein : die Rückgabe einer Nummer nach der ich dann suchen kann.

Java:
package application;

import java.sql.ResultSet;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.util.Callback;

public class SBOX {
   static String output;
   private static ObservableList<ObservableList> TV_Content;
   private static TableView TV_Tab = new TableView();

   public static String Open_S_Window(String str_sql) {
     Stage window = new Stage();

     window.initModality(Modality.APPLICATION_MODAL);
     window.setTitle("Suche Mitglied");
     window.setWidth(600);
     window.setHeight(500);

     Label label = new Label();
     TextField inputfield = new TextField();

     label.setText("Suchtext :");
     inputfield.setMinWidth(450);

     HBox eingabefeld = new HBox(50);
     eingabefeld.setAlignment(Pos.CENTER);
     eingabefeld.getChildren().addAll(label, inputfield);

     HBox AktTabelle = new HBox(10);
     AktTabelle.setAlignment(Pos.CENTER);
     AktTabelle.getChildren().add(TV_Tab);

     VBox layout = new VBox(10);
     layout.setAlignment(Pos.CENTER);
     layout.getChildren().addAll(eingabefeld,AktTabelle);

     BuildTVData("");

     // Display window and wait for it to be closed
     Scene scene = new Scene(layout);
     window.setScene(scene);
     window.showAndWait();
     return output;
   }

   public static void InitTabView (String str_sql) {
   }

   public static void BuildTVData(String StrSql) {
     TV_Content = FXCollections.observableArrayList();
     try{
       /**********************************
       * Resultset erstellen  *
       **********************************/
       DATA TabDaten = new DATA();
       String Str_sql = "select ID, VNAME, NNAME from MEMBERS where ID = 1";
       InitTabView(Str_sql);
       ResultSet rs = TabDaten.getDataRecSet(Str_sql);

       /**********************************
       * TABLE COLUMN ADDED  *
       **********************************/
       for (int i=0 ; i<rs.getMetaData().getColumnCount(); i++) {
         /*final int j = i;
         TableColumn TV_Cols = new TableColumn(rs.getMetaData().getColumnName(i+1));
         TV_Cols.setCellFactory(

         new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>() {

         public ObservableValue<String> call(CellDataFeatures<ObservableList, String>param)
         {
         return new SimpleStringProperty(param.getValue().get(j).toString());
         }
         }
         );

         TV_Tab.getColumns().addAll(TV_Cols);*/
         System.out.println("Column ["+ i +"] :" + rs.getMetaData().getColumnName(i+1));
       }

       TableColumn IDColumn = new TableColumn("ID");
       IDColumn.setVisible(false);
       IDColumn.setCellValueFactory( new PropertyValueFactory("ID"));

       TableColumn VNAMEColumn = new TableColumn("Vorname");
       VNAMEColumn.setPrefWidth(180);
       VNAMEColumn.setCellValueFactory( new PropertyValueFactory("VNAME"));

       TableColumn NNAMEColumn = new TableColumn("Nachname");
       NNAMEColumn.setPrefWidth(380);
       NNAMEColumn.setCellValueFactory( new PropertyValueFactory("NNAME"));

       TV_Tab.getColumns().addAll(IDColumn, VNAMEColumn, NNAMEColumn);

       /********************************
       * Data added to ObservableList *
       ********************************/
       while(rs.next()){
         ObservableList<String> row =FXCollections.observableArrayList();
         //Iterate Row
         for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++) {
           //Iterate Column
           row.add(rs.getString(i));
         }
         System.out.println("Row [1] added "+ row );
         TV_Content.add(row);
       }
       TV_Tab.setItems(TV_Content);
     }catch(Exception e){
       e.printStackTrace();
       System.out.println("Error on Building Data");
     }
   }
}
 
Zuletzt bearbeitet von einem Moderator:
S

strußi

mit ObservableList<String> row =FXCollections.observableArrayList(); überschreibst du jedesmal deine daten, zieh das aus der while-schleife raus
 
J

Joob

Ja das stimmt,
aber ich speichere die Variable row kumulativ in TV_Content und das gebe ich mit SetItems an die TableView TV_Tab.

Ich habe mich da an einem Beispiel orientiert und vermutet das sich Typ des Inhalts der ObservableList ändert und dies so sein muss damit da TableView das verarbeiten kann.
 
J

Joose

Hier ein Link der dir vielleicht hilft: http://stackoverflow.com/questions/19184255/javafx-2-2-dynamic-table-view-table-data

Nein das "row = FXCollections..." passt schon in der while-Schleife. Das Objekt wird ja zu einer Liste hinzugefügt und bleibt daher erhalten

(Nur am Rande) Du solltest dir überlegen deine Architektur zu überarbeiten. Man sollte niemals Datenbankoperationen und UI Operationen mischen! Immer brav trennen, damit die Komponenten ausgetaucht werden können und einzeln testbar bleiben.
Stichtwort: MVC, 3Tier Architektur, ...
 
J

Joob

Ich habe gedacht das die Trennung dadurch gewährleistet ist, das ich den Zugriff auf die Daten in der Klasse DATA untergebracht habe.
Mein Plan war es dann nur die Klasse zu tauschen und damit die Trennung klar zu haben.

Was bedeutet denn dann Trennung gem. MVC. Mit MVC hatte ich mich beschäftigt und für das Hauptformular einen Controler eingerichtet. Diese Fenster sollte ehr den Charakter eines Dialoges haben welcher auf Basis eines SQL eine ID zurückgibt.
 
J

Joose

Jap das ist schon ein Anfang. Trotzdem hast du noch eine Koppelung da du ResultSet direkt in der UI Klasse verwendest.
Beispiel: Was wäre denn du von einer Datenbank auf ein REST Service oder auf Files umstellen willst? Dann müsstest du deine Klasse SBOX anpassen obwohl diese eigentlich nur zum Anzeigen von Daten verwendet werden sollte.

Wie oben schon gesagt ist das nur eine Anmerkung am Rande. Da es wahrscheinlich nur ein kleines privates Projekt ist und bleibt ;)
 
J

Joob

Schönen Dank für den Tipp, ich habe das Problem verstanden. Muss ich aber erst auf die Liste setzen.
Allerdings besteht mein eigentliches Problem immer noch, ich hab schon alles probiert, das TableView zeigt keine Daten an. Wieso?
 
J

Joose

Hast du dir den Link angeschaut den ich oben gepostet habe? Dort hat jemand ein ähnliches Problem.
Hast du schon probiert von dem Objekt "TV_Tab" nicht die Items neu zu setzen sondern die vorhanden einfach mit deinen Zeilen zu ergänzen?
 
J

Joob

Ja hab ich. Dafür habe ich die Variable row verwendet, hat aber nichts verbessert.

Allerdings habe ich folgendes festgestellt.
Ich kann in der TabView genau so viele Zeilen anklicken wie ich Zeilen im resultset habe. Damit ist doch klar das die Ergebnisse ankommen.

Ich führe das Problem inzwischen darauf zurück das die unter PropertyValueFactory gesetzten Spaltennamen nicht passen. Die Spalten kommen ja auch aus dem Resultset, woher sollte die Liste in welche ich die Daten schreibe diese kennen.
Ich weiß aber keinen Weg die richtigen Spaltennamen zu finden .
Kannst Du mir helfen.
 
J

Joob

Inzwischen habe ich einen EventHandler gebaut, wenn ich die oben erwähnten Zeilen doppelklicke bekomme meine ID. Es schein eine Darstellungsproblem zu sein.

In der TabView werden keine Namen angezeigt obwohl die Zeilen vorhanden sind und beim Doppelklick wird mir auch die Zeile angegeben.

Kannst Du mir noch mal einen Tipp geben.
 
J

Joob

upload_2015-11-2_22-8-25.png

So sieht das Fenster aus, wenn ich auf die Zeile doppelklicke bekomme ich die Daten allerdings kann ich sie nicht sehen.
Wo sind die Daten. Eigentlich sollte dort ein Vorname und Nachname stehen.

Hier noch einmal der Code

Java:
package application;


import java.sql.ResultSet;


import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;



public class SBOX {

   static String output;
   static String[] ZeilenElemente;
   private static ObservableList<ObservableList> TV_Content;
   private static TableView TV_Tab = new TableView();



  //_________________________________________________________________________________________________
   public static String Open_S_Window(String Str_sql) {

     Stage window = new Stage();

     //
     window.initModality(Modality.APPLICATION_MODAL);
     window.setTitle("Suche Mitglied");
     window.setWidth(600);
     window.setHeight(500);

     Label label = new Label();
     TextField InputField = new TextField();

     label.setText("Suchtext :");
     InputField.setMinWidth(450);

     // Eingabe der Suchzeichenfolge
     HBox eingabefeld = new HBox(50);
     eingabefeld.setAlignment(Pos.CENTER);
     eingabefeld.getChildren().addAll(label, InputField);

  /*_______________________________________________________________________________________________
     Anordnen im Fenster  ____________________________________________________________________________________*/
     HBox AktTabelle = new HBox(10);
     AktTabelle.setAlignment(Pos.CENTER);
     AktTabelle.getChildren().add(TV_Tab);

     VBox layout = new VBox(10);
     layout.setAlignment(Pos.CENTER);
     layout.getChildren().addAll(eingabefeld,AktTabelle);
     layout.setPadding(new Insets(20,20,20,20));


  /*_______________________________________________________________________________________________
     Columns für TableView  ____________________________________________________________________________________*/
     TableColumn<?, String> IDColumn = new TableColumn("ID");
  IDColumn.setVisible(false);
     IDColumn.setCellValueFactory( new PropertyValueFactory<>("ID"));

  TableColumn<?, String> VNAMEColumn = new TableColumn("Vorname");
  VNAMEColumn.setPrefWidth(180);
  VNAMEColumn.setVisible(true);
  VNAMEColumn.setCellValueFactory( new PropertyValueFactory<>("VNAME"));

  TableColumn<?, String> NNAMEColumn = new TableColumn("Nachname");
  NNAMEColumn.setPrefWidth(380);
  NNAMEColumn.setVisible(true);
  NNAMEColumn.setCellValueFactory( new PropertyValueFactory<>("NNAME"));
  
  System.out.println(NNAMEColumn.idProperty());

  TV_Tab.getColumns().addAll(IDColumn, VNAMEColumn, NNAMEColumn);

  
  /*_______________________________________________________________________________________________
     Events  ____________________________________________________________________________________*/

     // Event zur Ausgabe der Doppelklick gewählten Zeile, repektive der ID
     TV_Tab.setOnMousePressed(new EventHandler<MouseEvent>()
     {
      [USER=48687]@Override[/USER]
      public void handle(MouseEvent event) {
      if (event.isPrimaryButtonDown() && event.getClickCount() == 2) {

         Node node = ((Node) event.getTarget()).getParent();
      TableRow row;

      if (node instanceof TableRow) {
      row = (TableRow) node;
      } else {
      // Doppelklick in die Tabelle
      row = (TableRow) node.getParent();
      }
      ZeilenElemente = row.getItem().toString().split(",");
      output = ZeilenElemente[0].substring(1);
      System.out.println(output);
      window.close();
      }
      }
     });

    
     // Lost Focus für Textfeld
     InputField.focusedProperty().addListener(new ChangeListener<Boolean>()
     {
      [USER=48687]@Override[/USER]
      public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue)
      {
      if (newPropertyValue)
      {

      }
      else
      {
           BuildTVData(Str_sql + "'%" + InputField.getText() + "%'");

      }
      }
     });



     /*__________________________________________________________________________________________________________________
     Fenster anzeigen und warten  ____________________________________________________________________________________*/
    
     Scene scene = new Scene(layout);
     window.setScene(scene);
     window.showAndWait();

     return output;

   }



     //________________________________________________________________________________________
     public static void InitTabView (String Str_sql) {

     }



     //_________________________________________________________________________________________
     public static void BuildTVData(String Str_sql) {

       ObservableList<ObservableList> TV_Content = FXCollections.observableArrayList();

       try{


         /**********************************
        * Resultset erstellen  *
        **********************************/
        DATA TabDaten = new DATA();
         InitTabView(Str_sql);
         ResultSet rs = TabDaten.getDataRecSet(Str_sql);


        /********************************
        * Data added to ObservableList *
        ********************************/
        while(rs.next()){

           ObservableList<String> row =FXCollections.observableArrayList();

        //Iterate Row
        for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++)
           {
           //Iterate Column
        row.add(rs.getString(i));
        }

        TV_Content.add(row);

        }

        System.out.println(TV_Content);
        TV_Tab.setItems(TV_Content);

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


         }



     public static ObservableList<ObservableList> getTV_Content() {
       return TV_Content;
     }



     public static void setTV_Content(ObservableList<ObservableList> tV_Content) {
       TV_Content = tV_Content;
     }


   }
 
Thema: 

TableView zeigt keine Daten an

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben