Component zugreifen

Hallo,

und zwar habe ich ein TabbedPane erstellt. In jedem Tab befindet sich wieder 2 Tabs. Nun möchte ich den Inhalt des einen Tabs ändern, der gerade geöffnet ist.

Mit
Java:
getComponentIndex
bekommt man ja die Componente des gerade geöffneten Tabs.


Mit
Java:
innerestabbedpane.setComponentAt(innerestabbedpane.getSelectedIndex(), panel)

habe ich das Problem, dass der zuletzt erstellte Tab geändert wird und nicht wie gewünscht der Inhalt des geöffneten Tabs.

Mit
Java:
äußerestabbedpane.setComponentAt(äußerestabbedpane.getSelectedIndex(),panel)
wird logischerweise der gesamte Inhalt eines äußeren Tabs überschrieben und in dem Tab sind die zwei Tabs nicht mehr sichtbar.

Muss ich mir, um das korrekt zu lösen erst mit
Java:
getComponentAt()
die Component holen, dann die innere Registerkarte suchen und diese dann überschreiben, damit ich ich schließlich Component wieder einfügen in den Tab?
 
Zuletzt bearbeitet:
schon mal was von update(), repaint() und der gleich gehört ?
F A I L
=> FAIL :noe:


Nun möchte ich den Inhalt des einen Tabs ändern, der gerade geöffnet ist.
Was genau heisst in dem Fall ändern? Möchtest du Komponenten komplett austauschen (wie z.B. mit dem CardLayout)?

ein TabbedPane erstellt. In jedem Tab befindet sich wieder 2 Tabs
Also quasi ein TabbedPane, wobei ein Tab wieder ein TabbedPane mit 2 Tabs enthält?

Dir bleibt eigentlich nichts weiter übrig als dich entweder die Component-Kette entlang zu hangeln oder mitzuschleifen welche Tabs gerade ausgewählt wurden. Dann könntest immer direkt diese Tabs ansprechen, würde aber mit Sicherheit einen Listener vorraussetzen, den du dann anhängst und zentral auswertest.
 
In dem Konstruktor meiner Klasse erstelle ich das TabbedPane. In einer Methode kann man dann einen Tab hinzufügen. In dieser Methode wird wiederum noch ein TabbedPane mit zwei Tabs A und B erstellt, das dem Tab hinzugefügt wird.

In Tab A habe ich einen Button. Wenn dieser gedrückt wird, dann soll der Inhalt von Tab A komplett ersetzt werden, der Button also verschwinden und beispielsweise ein Foto eingefügt werden.
 
Wie digga schon gesagt hat, musst du dir schon irgendwie die Referenz des Objektes verschaffen, welches du verändern willst.
Das kannst du entweder machen, indem du dir die Passende Indexkombination holst und dann damit die Componente ansprichst oder du speicherst dir immer die aktive(n) Componente(n) in einer Variable und sprichst dann diese an.
Damit dein Programm aber weiss, wann sich diese Werte ändern/aktuallisieren müssen, musst du auf jeden Fall Listener benutzen, die dann diese Änderungen anstoßen.

Gruß Vanny

PS: Den Post von J7Dev kannst du einfach ignorieren, is blödes Zeug.
 
wenn du den Button drückst dann hast du doch ne Komponentenhierarchie ausgehend vom Button nach oben zu dem Tab A, das sollte doch reichen. Dann kannst beim ActionListener mit e.getSource() arbeiten und hangelst dich einige Schritte nach oben. Geht natürlich nur wenn du in jedem Tab A den selben Grundaufbau hast (zB Tab A - Panel - Inhalt)
 
Vielleicht noch als Hinweise: Ich mache das Programm mit dem MVC Konzept.

In jedem Tab A ist der selbe Grundaufbau vorhanden. Wie meinst du das jetzt, mit einige Schritt nach oben hangeln?

In meiner Controller Klasse könnte ich ja für ein Action e mit e.getSource() die Component holen und diese dann meiner Methode übergeben, in der ich den Inhalt ändern möchte.
Wie finde ich aber in der Component meinen Tab, den ich ändern möchte?
 
Zuletzt bearbeitet:
Meinst du sowas wie das hier?
Java:
void neuenTabAnlegen(){
	JTabbedPane inneresTab = new JTabbedPane();
	JButton tabZwoÄndern = new JButton("Tab 2 ändern");
	inneresTab.addTab("Button", tabZwoÄndern);
	inneresTab.addTab("Noch frei", new JPanel());
	tabZwoÄndern.addActionListener(new TabChanger(inneresTab,1));
        mainTab.addTab("nochn Tab", inneresTab);
}
class TabChanger implements ActionListener(){
	JTabbedPane tab;
	int index;
	TabChanger(JTabbedPane tab, int index){
		this.tab = tab;
		this.index = index;
	}
	public void actionPerformed(ActionEvent ae){
		//Bild holen über einen JFileChooser
		//ImageIcon erzeugen
		//und dann...
		tab.getTabComponentAt(index, new JLabel(imageIcon));
	}

}
Jetzt weiss der Button genau, welchen ActionListener er benachrichtigen soll, und der Listener weiss genau, in welchem Tab der Button betätigt wurde, und was zu tun ist.
 

Neue Themen


Zurück
Oben