JavaFX Tabelle zeilenweise mit Werten füllen und an Container anpassen

Diskutiere Tabelle zeilenweise mit Werten füllen und an Container anpassen im AWT, Swing, JavaFX & SWT Forum; Hallo allerseits Ich beschäftige mich seit gestern mit JavaFX. Ich habe eine Tabelle erstellt und will diese mit Werten füllen. So, wie mir die...

  1. White_Fox
    White_Fox Mitglied
    Hallo allerseits

    Ich beschäftige mich seit gestern mit JavaFX. Ich habe eine Tabelle erstellt und will diese mit Werten füllen. So, wie mir die Daten vorliegen, wäre mir zeilenweises Schreiben am liebsten.
    Ein weiteres Problem: Jede zweite Zeile soll als eine Art Überschrift dienen. Daher will ich einen Teil oder alle Zellen jede zweiter Zeile verbinden. So etwa:
    Code (Text):

    | Zelle1 | Zelle2 | . . . . .Zelle3 - Zelle 6. . . . |
    | Zelle1 | Zelle2 | Zelle3 | Zelle4 | Zelle5 | Zelle6|
    | Zelle1 | Zelle2 | . . . . .Zelle3 - Zelle 6. . . . |
    | Zelle1 | Zelle2 | Zelle3 | Zelle4 | Zelle5 | Zelle6|
     
    Zusätzlich werden sich die Zellwerte selber nicht allzuhäufig ändern, wahrscheinlich sogar gar nicht, dafür werden aber oft neue Zeilen oder gleich ganze Spalten hinzukommen.

    Und nun: Wie mache ich das am Besten?

    Später soll der Benutzer alle Zellen/Zellverbände anklicken können und ich möchte dann wissen, welche er angeklickt hat. Aber das ist der nächste Schritt, wenn die Tabelle angezeigt wird wie ich das haben will bin ich schon froh. :)

    Und noch etwas zur Formatierung der Tabelle: Die Tabelle hab ich in ein Scrollpane gepackt, denn die kann mal größer als das Fenster werden. (Die ScrollPane liegt in einem Tab, der in einem SplitPane liegt, dieser in einem BorderPane...)
    Code (Text):

    //Fill library stamp tab
    ScrollPane scrollPane= new ScrollPane();
    tab.setContent(scrollPane);
    centerviewTable = new TableView();
    centerviewTable.setEditable(true);

    centerviewTable.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
    scrollPane.setContent(centerviewTable);
    Die Tabelle wird aber nur so groß angezeigt, wie sie ist. Ich hätte nun gerne, daß die mindestens bis zur Größe des Fensters aufgeblasen wird. Hat da jemand eine Idee?
    Ich hab es u.a. mit einem BorderLayout probiert, aber das funktionierte alles nicht.
     
  2. Java online lernen
  3. White_Fox
    White_Fox Mitglied
    Kleiner Nachtrag:
    Ich habe mal auf gut Glück etwas an diesem Beispiel herumprobiert:
    http://java-buddy.blogspot.com/2013/03/javafx-editable-tableview-with-dynamic.html

    Ich hab die Beispiele mit dem Observables und CallBack nicht verstanden weil ich nicht erkennen konnte, wie die Tabelle (bzw. die CellFactory) erkennen kann welche Methode sie aufrufen muß.
    Da die Methode getId() nirgendwo erkennbar im Code aufgerufen wird hab ich sie einfach mal in getBlah() umbenannt, und schon bleibt die Spalte "ID" in der Tabelle leer.

    Wenn ich jetzt aber die Zeile 132
    Code (Text):

    col_id.setCellValueFactory(
                        new PropertyValueFactory<Record, String>("id"));
     
    umändere in:
    Code (Text):

    col_id.setCellValueFactory(
                        new PropertyValueFactory<Record, String>("blah"));
     
    dann funktioniert es wieder-hä?

    Das einzige was mir einfällt wie das funktonieren könnte wäre Reflexion. Aber das hab ich bisher immer als wildes Hackerzeugs angesehen und auch selber nur benutzt, wenn ich in Unittests private Methoden aufbrechen wollte weil ich dann doch mal im Test das innere Verhalten meiner Klasse beobachten wollte/mußte.

    Aber mal ehrlich-das kann doch nicht der von den Java-Leuten gewollte Weg sein, eine dämliche Tabelle mit Leben zu füllen? Da muß es doch noch einen vernünftigen Weg geben, oder nicht? Einerseits sehe ich wirklich nicht wie ich so nacher Zellen verbinden kann, und wehe man refakturiert unvorsichtig...und wie soll ich zur Laufzeit Methoden zu meiner Klasse hinzufügen?

    Oder tue ich den Javaentwicklern da gerade großes Unrecht an und mir kommt das nur völlig umständlich vor?
     
  4. mihe7
    mihe7 Bekanntes Mitglied
    Dieses wilde Hackerzeug aber auch. Dazu dann noch diese geheimnisvollen Java Beans - voll crazy ;)

    Die View vom Model zu entkoppeln ist durchaus gewollt. Google mal nach MVC.

    Sagen wir mal so: es ist völlig klar, dass der Aufwand mit der Flexibilität steigt.

    Soweit ich das sehe, funktioniert das (noch) nicht von Haus aus. Du willst eher etwas wie das hier: https://github.com/controlsfx/controlsfx, speziell https://controlsfx.bitbucket.io/org/controlsfx/control/spreadsheet/SpreadsheetView.html
     
    White_Fox gefällt das.
  5. White_Fox
    White_Fox Mitglied
    Hallo mihe7

    Erstmal ein frohes neues Jahr und viel Erfolg in selbigem.

    Hm, controlsfx...jetzt weiß ich warum ich diesen Artikel auf fxexperience absolut nicht verstanden habe. Vielen Dank, daß sieht tatsächlich nach dem aus was ich will. :)

    View und Model zu entkoppeln hab ich schon vor, das MVC-Muster ist mir bekannt. Auch wenn ich es jetzt zum ersten Mal anwende.
     
  6. mihe7
    mihe7 Bekanntes Mitglied
    Danke, gleichfalls.

    Das meinte ich damit nicht. Der Tabelle ist es - da MVC - egal, wo die Daten herkommen. Du hast halt eine PropertyValueFactory verwendet, und daher werden die Daten per Reflection ermittelt.
     
  7. White_Fox
    White_Fox Mitglied
    Das klappt ja schonmal gut mit der SpreadsheetViewklasse. Spalten und Zeilen erstellen funktoniert. :)

    Allerdings hänge ich jetzt bei einer Sache, die mit der alten TableViewklase schon funktioniert hat: ich möchte einer Gruppe von Spalten einen gemeinsamen Header zuweisen.
    Die Tableview hab ich einfach mit Columnobjekten gefüttert (das erste Columnobjekt hab ich vorher aus mehreren anderen Columnobjekten erstellt). Das Ergebnis sah so aus:

    [​IMG]

    Und das hätte ich jetzt gern wieder. Ich sehe nur nicht, wie ich das in der Spreadsheetview machen kann. Es gibt zwar eine Spreadsheetcolumnklasse, aber die kann ich nicht instanzieren.

    Hast du da noch eine Idee?
     

    Anhänge:

  8. White_Fox
    White_Fox Mitglied
    Kleiner Nachtrag:
    Genau genommen hab ich nicht versucht, das über das Spreadsheetviewobjekt, sondern über das BaseGridobjet zu arbeiten. Ich hoffe es ist trotzdem klar was ich meinte.

    Und nochwas: Wieso kann ich meinen Beitrag nicht editieren? (Bzw. wo geht das?)

    Ach, ich sehs grad selber. Scheint zeitbegrenzt zu sein...
     
  9. mihe7
    mihe7 Bekanntes Mitglied
    White_Fox gefällt das.
  10. White_Fox
    White_Fox Mitglied
    So...mittlerweile krieg ich es hin, der Spreadsheetview einen vernünftiegn Header zu verpassen und mit Werten zu füllen.

    Was ich noch nicht hinbekomme: Wie kann ich da jetzt Zellen verbinden? Im HelloSpreadsheetview-Beispiel von controlsfx geht das wohl anscheinend über die Grid.spanColumn()-Methode. Ich hab da im Beispiel mal spaßeshalber den ein oder anderen Parameter geändert und da hat das gut funktioniert.
    Bei mir führt die spanColumn()-Methode höchstens dazu, daß die Zellen komplett verschwinden. Gelegentlich auch die entsprechenden Spalten.

    Auch die SpreadsheetCell-Klasse stellt so eine setColumnSpan()-Methode zur Verfügung, auch die createCell()-Methode hat dafür Übergabeparameter. Die würde ich am liebsten verwenden, erhalte da aber das gleiche Ergebnis.

    Hier mal etwas Code, wie ich das erstelle. Sieht jemand, was da noch fehlt?
    Ich füttere das Ganze aktuell immer mit den gleichen Daten, es kommt erstmal immer eine 2x6-Tabelle raus.
    Code (Text):

           LibraryPage activePage;
           Grid grid;
           Iterator<StampSet> stampsetIterator;
           ObservableList<ObservableList<SpreadsheetCell>> rows;
           StampSet stampset;
           double tablewidht;
           int rowcnt;

           activePage = model.getActiveLibrayPage();

           //Create tableheader
           grid = new GridBase(activePage.cntStampSets() * 2, activePage.cntAllProperties());
           tablewidht = 0;
           //Temporary properties
           for (String s : activePage.getTemporaryProperties()) {
               grid.getColumnHeaders().add(s);
               tablewidht += (s.length() * 8.5);
           }
           //Persistant properties
           for (String s : activePage.getPersistantProperties()) {
               grid.getColumnHeaders().add(s);
               tablewidht += (s.length() * 8.5);
           }
           //Fill table alternatig with stampset name and its stamp descriptions
           rows = FXCollections.observableArrayList();
           stampsetIterator = activePage.getStampSetIterator();
           rowcnt = 0;
           while (stampsetIterator.hasNext()) {
               stampset = stampsetIterator.next();
               rows.add(getRowWithStampSetName(activePage, stampset));
               rowcnt++;
               //rows.add(getRowWithStampDescriptions(activePage.getAllProperties(), stampset));
               rowcnt++;
           }
           grid.setRows(rows);
    //       grid.spanColumn(3, 0, 3);
         
           //Do some grid formatting
           centerviewStamptable.setMinWidth(tablewidht);
           centerviewStamptable.setGrid(grid);
           for(int i = 0; i < grid.getColumnCount(); i++){
               int preferedLenght = grid.getColumnHeaders().get(i).length()*10;
               centerviewStamptable.getColumns().get(i).setPrefWidth(preferedLenght);
           }
           centerviewStamptable.setVisible(true);


        private ObservableList<SpreadsheetCell> getRowWithStampSetName(LibraryPage page, StampSet stampSet) {
           ObservableList<SpreadsheetCell> row;
           SpreadsheetCell cell;
           String stampname = stampSet.getName();
           int temporaries = page.getTemporaryProperties().size(); //Todo: Durch Methode cntAllTemporaries ersetzen
           int persistants = page.getPersistantProperties().size(); //Todo: Durch Methode cntAllPersistants ersetzen
           int cellsmax = page.cntAllProperties();

           row = FXCollections.observableArrayList();
           for (int i = 0; i < temporaries; i++) {
               cell = SpreadsheetCellType.STRING.createCell(i, 0, 0, 0, "");
               row.add(cell);
           }
           cell = SpreadsheetCellType.STRING.createCell(temporaries, 0, 1, 3, stampname);
    //       cell = SpreadsheetCellType.STRING.createCell(temporaries, 0, 1, 1, stampname);
    //       cell.setColumnSpan(3);
    //       for(int i = temporaries ; i < cellsmax; i++){
               row.add(cell);
    //       }
           return row;
       }
     
     
  11. White_Fox
    White_Fox Mitglied
    Schade, hat niemand eine Idee?

    Ich hab hier noch zwei Screenshots von dem, was mein Programm bisher liefert.
    Im ersten Bild hab ich den columnspan-Aufruf rausgenommen.
    ohne columnspan.PNG

    Und im zweiten Bild hat ich die columnspan-Aufruf auf die erste Zeile angewandt. Jetzt ist da nichts mehr, es wird auch kein anderer Hintergrund gezeigt wenn man mt der Maus darübergeht.
    mit columnspan 1. Zeile.PNG
     
  12. Java online lernen
Passende Stellenanzeigen aus deiner Region:





Die Seite wird geladen...

Tabelle zeilenweise mit Werten füllen und an Container anpassen - Ähnliche Themen

FilterSearch Tabelle
FilterSearch Tabelle im Forum Datenbankprogrammierung
Mapping mit Annotations von 2 Tabellen
Mapping mit Annotations von 2 Tabellen im Forum Datenbankprogrammierung
Letzte Änderung in der Tabelle wird nicht gespeichert
Letzte Änderung in der Tabelle wird nicht gespeichert im Forum AWT, Swing, JavaFX & SWT
Meine Tabelle befüllen in .fxml
Meine Tabelle befüllen in .fxml im Forum Java Basics - Anfänger-Themen
Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen?
Aufbau meiner Datenbank/Tabelle - Verbessern? So lassen? im Forum Datenbankprogrammierung
Thema: Tabelle zeilenweise mit Werten füllen und an Container anpassen