Swing Von anderer Klasse auf Eigenschaften einer Komponente zugreifen

Airwolf89

Aktives Mitglied
Hallo,

ich habe mal eine Frage. Ich habe eine GUI, mit jeder menge Komponenten drauf. Nun habe ich noch einen Frame mit einer Auswahl drauf (Radiobuttons). Beim treffen einer Auswahl möchte ich auf die Eigenschaften von Komponenten auf meinem ersten GUI zugreifen können, also z.B. bei einer Tabelle die Anzahl der Spalten ändern. Wie mache ich das am besten?

Danke im voraus.
 
laufen die beiden Frames im gleichen Programm oder in zwei verschiedenen, bei letzteren musst du erstmal eine Kommunikation einrichten, z.B. über Sockets,
ansonsten müssen sich die Objekte kennen, Referenzen übergeben werden usw.,

zur Änderung kann das zu ändernde Frame nun eine ausführliche API anbieten, getComponentAtXY() oder gleich getTableSowieso(), welches eine eigene Klasse ist,
oder einfach nur eine Methode changeZOnTableSowieso(parameter), was immer du am besten brauchst, um es für das zweite Frame so einfach wie möglich zu machen,

oder du verzichtest auf jegliches Angebot und das zweite Frame hat wirklich nur das Frame-Objekt vom ersten,
dann muss es darauf Standard-API-Methoden (getComponent()) sowie per Reflection zugreifen um irgendwelche Dinge zu setzen und changed-Ereignisse auszulösen, das kann sehr unschön werden,

über Sockets ist das auch nicht zu machen, da muss die Gegenseite wenigstens ein paar entsprechende Logik-Klassen anbieten um beliebiges per Reflection zu ändern, das wäre eine heftige Sicherheitslücke 😉
 
Hi,

danke erstmal für den Tipp das Objekt gleich zu übergeben. =)

Also die beiden Frames liegen im gleichen Programm.

Habe das jetzt mal folgendermaßen probiert:

Java:
TableColumn col = new TableColumn();

        for (int i = 0; i < lColumn; i++) {
            col = TBL_Entities.getColumnModel().getColumn(i);
            TBL_Entities.removeColumn(col);
        }
        TBL_Entities.repaint();

        col = new TableColumn();
        for (int i = 0; i < fieldCount[0]; i++) {
            TBL_Entities.addColumn(col);
        }
        TBL_Entities.repaint();
        this.dispose();

Ich habe dem zweiten Frame die Tabelle und deren Spaltenanzahl übergeben.
TBL_Entities ist diese Tabelle, in lColumn befindet sich die Spaltenanzahl.

Nur irgendwie löscht er jetzt jede zweite Spalte und schmeißt mir danach ne ArrayIndexOutOfBounds Exception mit dem Hinweis 15 >= 15.

Das mit dem Spalten hinzufügen klappt soweit, hatte ich schon getestet.

Was hab ich hier falsch gemacht? Oder gibts nen anderen eleganteren Weg die Spaltenzahl neu zu definieren und die Tabelle mit dieser neuen Spaltenzahl dann anzeigen zu lassen?

Danke im voraus.
 
eleganter ist glaube ich immer ein eigenes TableModel mit der Methode getColumnCount()
und im Falle des DefaultTableModels fireTableStructureChanged() danach
How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

was hast du denn bisher für Daten in der Tabelle? wenn das Model von 15 Spalten ausgeht, kann man vielleicht nicht einfach so eine löschen

-------
Zeile 9 bis 12 sind etwas suspekt, wenn du mehrere Columns hinzufügenwillst, dann doch nicht mehrfach dasselbe Objekt,
an dieser Stelle muss man nicht sparen, ruhig ein 'new TableColumn()' pro Schleifendurchlauf,
mit TableModel wäre aber wahrscheinlich auch dieser Code obsolet
 
Also, es sieht folgendermaßen aus:

Die Tabelle soll Materialien oder Kunden anzeigen.
Es gibt verschiedenartige Materialien. Jedes Material hat eine festgelegte Anzahl an Eigenschaften, die Infos hole ich aus einer Datenbank. Zu Beginn ist die Tabelle leer, hab ihr 30 Spalten gegeben. Nun sollen im Endeffekt nach Auswahl einer Produktkategorie in dieser Tabelle alle gelisteten Materialien in der Tabelle angezeigt werden. Deshalt brauche ich eine Möglichkeit je nach ausgewählter Kategorie der tabelle eine festgelegte Anzahl Spalten zu geben. Ich könnte zwar der Tabelle einfach nur 30 Spalten geben und die entsprechend füllen, aber das finde ich eher unschön.

fireStructureChange habe ich schonmal gesehen im Netz, allerdings kann ich diese Methode nirgends finden, bzw. ausführen, wird nicht gefunden.
 
> im Falle des DefaultTableModels fireTableStructureChanged()
bzw. genauer: in AbstractTableModel enthalten, von dem sollte man zumindest erben bei eigenen Models, sonst muss man gar die Listener selber verwalten + fireXY-Methoden natürlich

bei anderen Models ist das gegebenenfalls nicht da, auch im Interface nicht

> allerdings kann ich diese Methode nirgends finden, bzw. ausführen, wird nicht gefunden.

tja ich kenne deinen Code nicht,
falls du kein eigenes Model benutzt, kannst du versuchen, das vorhandene auf DefaultTableModel zu casten
 

Zurück
Oben