# jframe bzw. jpanel aktualisieren



## chehilbi (19. Feb 2009)

hallo zusammen,

ich habe in einem jframe 2 Panels. eines oben und eines im unteren bereich. ich möchte nun das jframe bzw. eines der beiden jpanels aktualisieren. 

wie kann ich das machen. hab es schon mit repaint, revalidate, invalidate... usw probiert, aber ich bekomm es einfach nicht gebacken !!!! Das kann doch nicht so schwer sein!

Bitte um Hilfe!!!!!


----------



## SlaterB (19. Feb 2009)

definiere 'aktualisieren'

repaint() zeichnet neu,
validate() berechnet das Layout neu,

was genau passiert davon nicht, am besten mit Beispielprogramm

wenn du eine Komponente durch eine andere ersetzen willst, dann sind natürlich weitere Schritte nötig, die man falsch machen kann,
etwa alte Komponenten nicht zu entfernen


----------



## chehilbi (20. Feb 2009)

mit aktualisieren meine ich, das das JFrame bzw. das JPanel neu geladen wird. Hab einiges probiert, aber bekomm es einfach nicht hin.

das JFrame bzw. JPanel soll neu geladen werden aufgrund eines Event (Action Listener siehe unten).

Verzeifele bitte um Hilfe!

class GuiMain extends JFrame implements ActionListener {

	private JPanel panelSymbole, panelTable;
	private JTable table;
	private DefaultTableModel model;

	public GuiMain() 
	{	
		MenuBar menubar = new MenuBar();
		setMenuBar(menubar);

		menuFile = new Menu("Datei");
		menubar.add(menuFile);

		panelTable = new JPanel();
		getContentPane().add(panelTable, BorderLayout.CENTER);
		BorderLayout jPanel5Layout = new BorderLayout();
		panelTable.setLayout(jPanel5Layout);
		panelTable.setBackground(Color.black);

		table = new JTable();
		JScrollPane scroll = new JScrollPane(table);
		table.setAutoCreateRowSorter(true);
		scroll.setPreferredSize(new Dimension(500, 278));
		panelTable.add(scroll);

		model = (DefaultTableModel) table.getModel();

	}


	public void actionPerformed(ActionEvent e) {

		Object source = e.getSource();

		if (source == neu || source == mNew) {
			/*
			GuiDetail test = new GuiDetail(0, Adressbuch.getPerson(999), model,
					table);
			test.setVisible(true);
			*/
		}

		if (source == search || source == mSearch) {
			GuiSuche suchen = new GuiSuche(model, table);
			suchen.setVisible(true);
			System.out.println(table.getSelectedRow());
		}


----------



## SlaterB (20. Feb 2009)

'neu geladen' kann man auch noch so und so auslegen,
willst du ein neues JFrame-Objekt erzeugen oder den gesamten Inhalt entfernen und durch irgendeinen Standardinhalt wie zu Beginn des Programms ersetzen?


> Action Listener siehe unten

ist ein ziemlich nicht-hilfreicher Hinweis,
es gibt in deinem Programm einen ActionListener, der sich um zwei Arten von Events kümmert (zweimal if),
beide von denen scheinen nichts mit GuiMain zu tun haben, ändern diese nicht, erstellen diese nicht neu oder ähnliches,
sondern kümmern sich je um irgendwas anderes (GuiDetail, GuiSuche)

was diese beiden JFrame-Erstellungen auf einmal mit 'das JFrame bzw. das JPanel neu geladen wird' zu tun haben ist absolut unklar,
zumal 'das JFrame bzw. das JPanel' allein schon ungenau gewählt ist, wenn es in deinem Programm anscheinend mindestens drei JFrames gibt (GuiMain, GuiDetail, GuiSuche)

noch ein weiteres Mal werde ich nicht mit 10 Gegenfragen antworten..


----------



## chehilbi (20. Feb 2009)

also ich möchte das der Inhalt von einem Jpanel, beinhaltet eine JTable, neu geladen wird. 
das neue laden soll nach einem klick auf einen button geschehen.

public void actionPerformed(ActionEvent e) {

	Object source = e.getSource();

             if (source == delete || source == mDelete) {

                panelTable.validate();

               // hier soll das neu laden aufgerufen werden
             }

}

es gibt doch revalidate()


----------



## SlaterB (20. Feb 2009)

'neu geladen' ist unklar


----------



## chehilbi (20. Feb 2009)

verstehst du mein Problem nicht, ich möchte das das Panel aktualisert, neu geladen, repaint wird. Das Poblem ist der Inhalt der Tabelle ändert sich ständig. desshalb möchte ich das Panel in dem die Tabelle sich befindet neu erzeuge, aufrufen, aktualiseren.


----------



## diggaa1984 (20. Feb 2009)

ich glaube du solltest mal genauer beschreiben was passiert wenn du auf nen buton drückst.

Du willst was aktualisieren .. normalerweise brauch man diese Funtkionen nur in den seltensten Fällen selbst aufrufen, musste ich zumindest noch nicht.

Du hast 2 Panels eins oben eins unten, was in dem Oberen is seh ich grad nicht, in dem Unteren hast du nen ScrollPane mit ner JTable drin .. soweit so gut. 

Was genau soll nun passieren wenn du auf einen Button drückst (den seh ich nicht mal in deinem code). Warum soll der Button explizit was aktualisieren, was gibts da neues was nicht automatisch erscheint!? Vielleicht hast ja ne falsche Vorstellung von einer gewissen Abarbeitung, aber mit den bisherigen Infos lässt sich das nicht feststellen. 

Für was ist denn das obere Panel gut, soll da etwas von GuiSuche oder GuiDetail drin landen, wie auch immer die definiert sind (JFrames, JPanels, oder irgendwas anderes!?)

Es fehlen noch massig infos um nen Bild von dem zu haben was du eigentlich genau umsetzen willst. Nicht selten befinden sich Fragesteller schon auf nem falschen Pfad, und den vorrangegangenen Abzweig zu finden kann da manchmal helfen


----------



## SlaterB (20. Feb 2009)

@chehilbi:
auf repaint bin ich schon in der ersten Antwort gekommen


> repaint() zeichnet neu,
> validate() berechnet das Layout neu,
> 
> was genau passiert davon nicht, am besten mit Beispielprogramm


 
nur hast du das ignoriert,
wenn du möchtest, dass etwas neu gezeichnet wird, dann reicht repaint(),
falls das nicht funktioniert, bringt es nix, 5x das gleiche zu fragen, sondern du musst genau erklären,
was vorher zu sehen ist, was stattdessen zu sehen sein soll und am besten ein Beispielprogramm dazu

ganz ganz ganz ganz ganz ganz ganz ganz ganz ganz nebenbei erfährt man durch kleine Nebensätze nun so elementar wichtige Informationen wie beispielsweise,
dass es um den 'Inhalt der Tabelle' geht,

das müsste als aller erstes im ersten Post stehen,
es geht also um die Aktualisiertung einer JTable,

diese Information ist hilfreich, denn darauf kann ich dir sagen, dass der Inhalt einer JTable sehr entscheidend von seinem TableModel abhängt, welche Daten dadrin enthalten sind,

poste mal bisschen Quellcode dazu, wie du das TableModel aktualisierst, oder was immer du bisher tuts,
aus obigen Quellcode wird wenig deutlich,
einerseits gibts da eine JTable in GuiMain mit model, welches aber nie angefasst wird,

stattdessen steht im ActionListener was von GuiDetail

im Zweifel könnte es reichen,
model.setNewData(..);
aufrufen, der Rest passiert von selbst, ohne repaint() oder sonst was


----------



## chehilbi (20. Feb 2009)

also geht tatsächlich nur um die aktualisierung der Tabelle. unten stehend der code wie die tabelle erstellt wird und mit Daten gefült wird. ich möchte nach einem bestimmten event, das die Tabelle neu aufgebaut (neugeladen wird). 


                          panelTable = new JPanel();
		getContentPane().add(panelTable, BorderLayout.CENTER);
		BorderLayout jPanel5Layout = new BorderLayout();
		panelTable.setLayout(jPanel5Layout);
		panelTable.setBackground(Color.black);

		table = new JTable();
		JScrollPane scroll = new JScrollPane(table);
		table.setAutoCreateRowSorter(true);
		scroll.setPreferredSize(new Dimension(500, 278));
		panelTable.add(scroll);

		model = (DefaultTableModel) table.getModel();

		model.addColumn("Kdnr");
		model.addColumn("Firma");
		model.addColumn("Zusatz");
		model.addColumn("Strasse");
		model.addColumn("PLZ");
		model.addColumn("Land");
		model.addColumn("Ort");
		model.addColumn("Fon");
		model.addColumn("Fax");


		for (kunde kunde : Adressbuch.getListe()) {
			model
			.addRow(new Object[] {

					kunde.getKdnr(),
					kunde.getFirma(),
					kunde.getZusatz(),
					kunde.getStrasse(),
					kunde.getPlz(),
					kunde.getOrt(),
					kunde.getLand(),
					kunde.getFon(),
					kunde.getFax(), 
			});			
		}


----------



## SlaterB (20. Feb 2009)

hier ein komplett lauffähiges Beispiel,
man beachte die Einfachheit der actionPerformed()


```
[B][SIZE=2][COLOR=#7f0055]public
[/COLOR][/SIZE][/B][LEFT][B][SIZE=2][COLOR=#7f0055]class[/COLOR][/SIZE][/B][SIZE=2] Test[/SIZE]
[LEFT][SIZE=2]{[/SIZE]
[B][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055]static[/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055]void[/COLOR][/SIZE][/B][SIZE=2] main(String[] args)[/SIZE]
[B][SIZE=2][COLOR=#7f0055]throws[/COLOR][/SIZE][/B][SIZE=2] Exception[/SIZE]
[SIZE=2]{[/SIZE]
[B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] GuiMain().setVisible([/SIZE][B][SIZE=2][COLOR=#7f0055]true[/COLOR][/SIZE][/B][SIZE=2]);[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE][/LEFT]
 
 
[LEFT][B][SIZE=2][COLOR=#7f0055]class[/LEFT]
[/LEFT]
[/COLOR][/SIZE][/B][LEFT][SIZE=2]GuiMain[/SIZE]
[LEFT][B][SIZE=2][COLOR=#7f0055]extends[/COLOR][/SIZE][/B][SIZE=2] JFrame[/SIZE]
[B][SIZE=2][COLOR=#7f0055]implements[/COLOR][/SIZE][/B][SIZE=2] ActionListener[/SIZE]
[SIZE=2]{[/SIZE][/LEFT]
 
[LEFT][B][SIZE=2][COLOR=#7f0055]private[/COLOR][/SIZE][/B][SIZE=2] JPanel [/SIZE][SIZE=2][COLOR=#0000c0]panelTable[/COLOR][/SIZE][SIZE=2];[/SIZE]
[B][SIZE=2][COLOR=#7f0055]private[/COLOR][/SIZE][/B][SIZE=2] JTable [/SIZE][SIZE=2][COLOR=#0000c0]table[/COLOR][/SIZE][SIZE=2];[/SIZE]
[B][SIZE=2][COLOR=#7f0055]private[/COLOR][/SIZE][/B][SIZE=2] DefaultTableModel [/SIZE][SIZE=2][COLOR=#0000c0]model[/COLOR][/SIZE][SIZE=2];[/SIZE][/LEFT]
 
[LEFT][B][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/B][SIZE=2] GuiMain()[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]JButton test = [/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] JButton([/SIZE][SIZE=2][COLOR=#2a00ff]"test"[/COLOR][/SIZE][SIZE=2]);[/SIZE]
[SIZE=2]test.addActionListener([/SIZE][B][SIZE=2][COLOR=#7f0055]this[/COLOR][/SIZE][/B][SIZE=2]);[/SIZE]
[SIZE=2]getContentPane().add(test, BorderLayout.[/SIZE][I][SIZE=2][COLOR=#0000c0]NORTH[/COLOR][/SIZE][/I][SIZE=2]);[/SIZE][/LEFT]
 
[LEFT][SIZE=2][COLOR=#0000c0]panelTable[/COLOR][/SIZE][SIZE=2] = [/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] JPanel();[/SIZE]
[SIZE=2]getContentPane().add([/SIZE][SIZE=2][COLOR=#0000c0]panelTable[/COLOR][/SIZE][SIZE=2], BorderLayout.[/SIZE][I][SIZE=2][COLOR=#0000c0]CENTER[/COLOR][/SIZE][/I][SIZE=2]);[/SIZE]
[SIZE=2]BorderLayout jPanel5Layout = [/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] BorderLayout();[/SIZE]
[SIZE=2][COLOR=#0000c0]panelTable[/COLOR][/SIZE][SIZE=2].setLayout(jPanel5Layout);[/SIZE]
[SIZE=2][COLOR=#0000c0]panelTable[/COLOR][/SIZE][SIZE=2].setBackground(Color.[/SIZE][I][SIZE=2][COLOR=#0000c0]black[/COLOR][/SIZE][/I][SIZE=2]);[/SIZE][/LEFT]
 
[LEFT][SIZE=2][COLOR=#0000c0]table[/COLOR][/SIZE][SIZE=2] = [/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] JTable();[/SIZE]
[SIZE=2]JScrollPane scroll = [/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] JScrollPane([/SIZE][SIZE=2][COLOR=#0000c0]table[/COLOR][/SIZE][SIZE=2]);[/SIZE]
[SIZE=2]scroll.setPreferredSize([/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] Dimension(500, 278));[/SIZE]
[SIZE=2][COLOR=#0000c0]panelTable[/COLOR][/SIZE][SIZE=2].add(scroll);[/SIZE][/LEFT]
 
[LEFT][SIZE=2][COLOR=#0000c0]model[/COLOR][/SIZE][SIZE=2] = (DefaultTableModel)[/SIZE][SIZE=2][COLOR=#0000c0]table[/COLOR][/SIZE][SIZE=2].getModel();[/SIZE][/LEFT]
 
[LEFT][SIZE=2][COLOR=#0000c0]model[/COLOR][/SIZE][SIZE=2].addColumn([/SIZE][SIZE=2][COLOR=#2a00ff]"Kdnr"[/COLOR][/SIZE][SIZE=2]);[/SIZE]
[SIZE=2][COLOR=#0000c0]model[/COLOR][/SIZE][SIZE=2].addColumn([/SIZE][SIZE=2][COLOR=#2a00ff]"Firma"[/COLOR][/SIZE][SIZE=2]);[/SIZE]
[SIZE=2][COLOR=#0000c0]model[/COLOR][/SIZE][SIZE=2].addRow([/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] Object[] {[/SIZE][SIZE=2][COLOR=#2a00ff]"123"[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2a00ff]"Mogelcom"[/COLOR][/SIZE][SIZE=2]});[/SIZE][/LEFT]
 
[LEFT][SIZE=2]setSize(300, 150);[/SIZE]
[SIZE=2]}[/SIZE][/LEFT]
 
[LEFT][B][SIZE=2][COLOR=#7f0055]public[/COLOR][/SIZE][/B][B][SIZE=2][COLOR=#7f0055]void[/COLOR][/SIZE][/B][SIZE=2] actionPerformed(ActionEvent e)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][COLOR=#0000c0]model[/COLOR][/SIZE][SIZE=2].addRow([/SIZE][B][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/B][SIZE=2] Object[] {[/SIZE][SIZE=2][COLOR=#2a00ff]"1234"[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#2a00ff]"General Bankrott"[/COLOR][/SIZE][SIZE=2]});[/SIZE]
[SIZE=2]}[/SIZE]
[SIZE=2]}[/SIZE][/LEFT]
```
 
edit: wieso kann ich denn keinen Code mehr formatiert eingeben?..
[/LEFT]


----------



## chehilbi (20. Feb 2009)

du soweit bin ich ja auch schon, wo wird denn die Tabelle erneut geladen bzw. aktualisiert????


----------



## diggaa1984 (20. Feb 2009)

in der Regel geschiet das automatisch durch interne Abarbeitung im Model. Da gibts diverse fireXXX-Methoden, welche dann die Aktualisierung, bzw die Änderung von etwas propagieren. Daher musst du nich zwingend selbst drum kümmern etwas neu zeichnen, das sollte alleine geschehen.

Edit: nutz mal Code-tags für deine Code-Schnipsel .. und "seid wann is der Code denn bunt!?" .. findsch gut 

Du sagtest die Tabelle ändert sich ständig, wie genau sieht das denn aus (Code)


----------



## SlaterB (20. Feb 2009)

chehilbi hat gesagt.:


> du soweit bin ich ja auch schon, wo wird denn die Tabelle erneut geladen bzw. aktualisiert????


 probier es aus, bei mir reicht es genau so,
interne Abläufe erklären Tutorials


----------

