Swing JTable wird nicht über zurückegebene Referenz geaddet.Wieso nicht?

  • Themenstarter Themenstarter Alohaaaa
  • Beginndatum Beginndatum
A

Alohaaaa

Gast
Wieso kann ich die Tabelle (buidTable()) nicht über den Rückgabewert der Methode buildPanel() eben diesem Panel adden. Falls die Beschreibung des Problems im Quelltext nicht hilfreich ist, einfach bescheid sagen. Ich finde, dass es so besser nachzuvollziehen ist.
Java:
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class Gui{

	private String[][] data = new String[][]
    {
		
			{"11", "12" ,"13", "14"},
			{"21", "22" ,"23", "24"},
			{"31", "32", "33", "34"}
			
	};
	
	private String[] header = new String []
			{
			"Spalte 1", "Spalte 2", "Spalte 3", "Spalte 4"
			};
	
	
	public JPanel buildTablePanel()
	{
		JPanel mainPanel = new JPanel(new BorderLayout());
		//mainPanel.add(buildTable());//-----------------------------<<<<<<<<<<-------------------<<<<<<<<<<<----
		return mainPanel;
	}
	
	public JScrollPane buildTable()
	{
		JTable table = new JTable(data, header);
		JScrollPane scrlTable = new JScrollPane(table);
		return scrlTable;
	}
	public JFrame createFrame()
	{
		JFrame frame = new JFrame();
		
		frame.setTitle("Tabellentest");
		frame.setSize(800,600);
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		buildTablePanel().add(buildTable());     // funktioniert nicht. Wäre doch eigentlich genau dasselbe wie "mainPanel.add(buildTable())" in der Methode "buildTablePanel()". Die Tabelle wird nur dargestellt, wenn "mainPanel.add(buildTable())" in "buildTablePanel()" nicht auskommetiert ist. Wieso gehts nicht mit der Methode die das Panel zurückgibt? 
		frame.add(buildTablePanel());  // funktioniert. wenn "mainPanel.add(buildTable())" nicht auskommentiert ist
		
		
		
		return frame;
	}
	
	public static void main(String[] args)
	{
		Gui gui = new Gui();
		JFrame frame = gui.createFrame();
		frame.setVisible(true);
	}
}

Danke schonmal.
 
Die Zeile
Code:
buildTablePanel().add(buildTable());
ist sinnlos, weil du danach keine Referenz auf die eben erstellte Komponente und diese auch keiner anderen hinzugefügt hast.

So würde es gehen:
[JAVA=49]JScrollPane tablePanel = buildTablePanel();
tablePanel.add(buildTable());
frame.add(tablePanel);[/code]
 
Meine Denkweise war eigentlich folgende: Ich erstelle dieses JPanel-Objekt, und arbeite mit dessen Referenz, die ja buildTablePanel() liefert. Deshalb ist es doch eigentlich wie
Code:
mainPanel.add(buildTable());
(meiner bisherigen Vorstellung nach). Mir is noch nicht ganz klar, wieso es nicht funktioniert, weil dein Code in meinen Augen =
Code:
tablePanel = mainPanel.add(buildTable());
ist und ja eigentlich nur das neue Panel mit der hinzugefügten Tabelle referenziert. Kann sein dass ich da gerade nen dicken Denkfehler habe. Ich denke so: "Hä wieso geht's nicht, ich benutze doch dieselben Referenzen?" Danke schonmal für den Hinweis auch wenn es mir noch nicht ganz klar ist.
 
Ich habe die Main-Methode mal geändert, was mich eigentlich bestätigt, denn auch so wird das Fenster erzeugt. Ich finde für mein obiges Problem keinen Grund(Ich benutze nur die Methoden-Rückgabewerte in der Main-Methode, um zu "beweisen", dass ich den Rückgabewert der Methode nicht referenzieren muss):
Java:
public static void main(String[] args)
	{
		Gui gui = new Gui();
		 gui.createFrame();
		 gui.createFrame().setVisible(true);
	}
 
Falls der Groschen immer noch nicht gefallen ist:
Du rufst zweimal buildTablePanel() auf und erhältst zwei JPanels. Zu dem ersten fügst du die JScrollpane hinzu, machst aber damit nichts weiter. Das zweite (ohne die JScrollPane) landet im JFrame.
Zu deinem "Beweis, dass du den Rückgabewert der Methode nicht referenzieren musst":
Hier erstellst du zwei JFrames. Der zweite wird sichtbar gemacht. Mit dem ersten passiert gar nix. Da die beiden JFrames aber identisch sind, merkst du das nicht. qed oder so ähnlich.
 

Zurück
Oben