TableView: 'Komplexes' Object

Kababär

Top Contributor
Hi,

im Rahmen eines Projektes wäre eine TableView für die Ansicht der Daten eigentlich ganz gut geeignet, nur gibt es da ein Problem: ich weiß nicht wie die TableView zu füllen ist und wie ich die Daten wieder rauslesen kann.

Im Prinzip gibt es im Model nur eine einzige Liste mit dem Typ "Account".
Ein Account hat eines Liste mit dem Typ "Transfer". Fast alle Attribute sind Properties, somit wäre das aktualisieren kein Problem.

Demnach soll es in der TableView nur zwei Spalten geben, eine für Account und eine für Transfer, wobei für jeden Account alle Transfers vertikal aufgelistet werden sollen, also pro Transfer eine eigene Zelle (Cell).
Exemplarisch also:
Code:
Account 1          Transfer 1a
                   Transfer 2a
                   Transfer 3a
Account 2          Transfer 1b
Account 3          Transfer 1a
                   Transfer 1b
                   Transfer 2a

Was ich eben nicht will, ist, dass der Account in jeder Zeile nochmals vorkommt.. (es sei denn, die Liste der Transfers ist so lange und man scrollt so weit runter, bis der Eintrag des Accounts nicht mehr zu sehen ist, dann würde ich ihn gerne "on top" behalten, aber eins nach dem anderen).
Bisher habe ich nur die Grundlagen geschaffen. Was wie folgt aussieht:
Code:
TableColumn<Account, String> accountColumn = new TableColumn<>("Accounts");
        accountColumn.setCellValueFactory(item -> item.getValue().nameProperty());

        TableColumn<Account, Transfer> transfersColumn = new TableColumn<>("Funktionen");
        transfersColumn.setCellFactory(new Callback<TableColumn<Account, Transfer>, TableCell<Account, Transfer>>() {

            @Override
            public TableCell<Account, Transfer> call(TableColumn<Account, Transfer> param) {

                TableCell<Account, Transfer> functionCell = new TableCell<Account, Transfer>() {

                    @Override
                    protected void updateItem(Transfer item, boolean empty) {
                        if (item != null) {
                            double function= item.getTransferFuction();
                            Label functionLabel = new Label(String.valueOf(function));
                            if (function< 0) {
                                function.setStyle("-fx-font-color:red");
                            } else {
                                functionLabel.setStyle("-fx-font-color:green");
                            }
                            setGraphic(functionLabel);
                        }
                    }
                };

                return functionCell;
            }

        });

Für die Transfers sollen nur die Funktionen (wie oben dargestellt) angezeigt werden.
Wie ist das lösbar?

Klicke ich auf eine Zelle (es wird immer die gesamte Reihe markiert. Kann man auch einzelne Zellen markieren?), so soll es möglich sein, Account und Transfer über vorgesehene Buttons zu verändern. Problem hierbei ist: wie kriege ich die Referenz auf das Transfer-Object?

Das ist sicherlich nicht einfach. Leider habe ich im Internet nichts gefunden, das mir helfen könnte, daher hoffe ich, dass mir jemand von euch helfen kann 🙂
 
Ich hoffe die Idee wird nicht gleich verrissen: Soweit ich das sehe, hast du eine m:n-Beziehung. Theoretisch ergeben sich daraus maximal m x n- Tabellenzeilen, also bei 100 accounts und 25 transfers sind das 2500 Zeilen. Du müsstest nach meiner Meinung also erst mal ein Arry füllen, in dem du die Daten aus deiner Liste ausliest. Nun ist ja auch jedes Tupel (m,n) eindeutig durch eine Zahl i, das sei der Index, bestimmbar( im obigen Beispiel ist i=1 bis 1500). Dabei entsteht i, indem du mitzählst, wenn du die Tupel generierst.
 
Also ich verstehe deinen Ansatz nicht...

warum schreibst du nicht erstmal einfach einen eigenes Modell welches in der ersten Spalte nicht nur den String als value zurück gibt sondern auch noch die Anzahl der Wiederholungen. Also wenn man dein Beispiel oben ansieht dann würde für die erste Spalte einfach z.B. "Account 1 : 1", "Account 1 : 2" zurück gegeben. Dann schreibst du dir einen eigenen TableCellRenderer und kann den sting beim : splitten und wenn die Zahl hinter dem : größer 1 ist dann zeichnest du einfach gar nichts.
Damit kannst du dann spätervauch problemlos ausrechnen ob du in Zeile eins was anzeigen musst weil der erste Eintrag oben raus gescrollt ist. Aber das ist der nächste Schritt.
 
@AndiE die Beziehung ist 1:m, da je ein Account eine Liste von Transfer-Objekten besitzt. Theoretisch würde die Idee von dir funktionieren, entweder mit dem Tupel oder einer Map.

@Thallius Genau dann wenn Zahl hinter dem ":" größer eins ist, wird es problematisch. Denn dann sollen die Einträge aus Transfers vertikal, jeder Eintrag in eine eigene Zelle aber in der selben Spalte, eingetragen werden.
Ich hab noch gar nicht ausprobiert, ob ich die einzelnen Objekte aus Transfers einfach der Spalte hinzufügen kann... Aber denke da kommt eine Exception weil es keine Beziehung Account gibt. Probiere ich mal gleich aus xD
Den TableCellRenderer schaue ich mir mal an (oder meinst du damit die CellValueFactory?)

Danke dzim, hatte ich gestern auch noch gefunden. Praktisch dass das so einfach geht🙂
 
Ich verstehe ehrlich gesagt nicht was du willst.

Wenn du mit in "eine eigene Zelle aber selbe Spalte" meinst das du mehrere Zellen in der gleichen Zeile und Spalte haben willst, dann ist das natürlich quatsch. Sowas geht nicht und macht man auch nicht. Du kannst aber z.B: einen MultiLineTableCellRenderer schreiben, der dir die Transfers in eine Zelle in mehrere Zeilen aufteilt. Aber wie gesagt. Ich kann im Moment nicht mehr folgen was Du eigentlich willst. Vielleicht machst du uns mal ein Bild wo man die Zeilen und Spalten anhand eines Trennstrichs sehen kann und setzt da deine Werte rein die du sie haben willst...
 
Eigentlich ist es einfach: eigene Zelle, selbe Spalte, andere Reihe/Zeile.
Muss gleich mal gucken ob ich mich irgendwo vertippt habe xD
Mache auch gleich noch ein Bildchen davon.
 
So, im Anhang ist jetzt ein Bild, hoffe das bringt jetzt Licht ins Dunkle 😀

Links stehen die Accounts, rechts die dazugehörigen Transfers, untereinander, nicht in weiteren Spalten.
Die Frage ist halt: Wie füge ich für jedes Element Transfer eines Accounts eine neue Zeile ein?
 

Anhänge

  • Tabelle.JPG
    Tabelle.JPG
    26 KB · Aufrufe: 44
wenn die Zahl hinter dem : größer 1 ist dann zeichnest du einfach gar nichts.
Ich hatte diesen Part falsch verstanden. Ich dachte du meinst, dass dann die TransferListe nicht gezeichnet werden soll.. dabei soll dann der Account nicht gezeichnet werden.
Sorry 😀 So geht das natürlich 😳

Das würde allerdings bedeuten, dass meine Datenmenge extrem wachsen würde.. gibt's keinen effizienteren Weg, das zu lösen?
 
Verstehe ich wieder nicht. Wieso erhöht sich deine Datenmenge? Im Model hast du doch weiterhin nur die Daten die du brauchst und gibst sie entsprechend an die anfragenden Tabelle.
 

Neue Themen


Zurück
Oben