Im JFrame Inhalte verändern per Methode aus anderer Class

Hallo

Ich dachte eigentlich, dass ich mich besser mit Java auskenne aber mein aktuelles "Projekt" belehrte mich eines besseren. Zugegeben, habe mich nie intensiv mit GUIs beschäftigt und brauchte es bisher auch nicht. Programmiere jetzt seit ca 5 Jahren mit Java und habe dafür fast ausschließlich die Konsole als I/O verwendet. Erst im ersten Semester Informatik Studium habe ich erste Berührungen mit der GUI gemacht. Nun gut zu meiner Frage:

Habe ein JFrame in dem befindet sich der Einfachheit halber ein JButton und ein JTextPane.

[Java]
package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class TestFrame extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel contentPane;
private TestPane tp = new TestPane();

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestFrame frame = new TestFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

public TestFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);

init();

}

private void init() {
JButton btnNewButton = new JButton("New button");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
//contentPane.remove(1);
tp.doSmth("test");
//contentPane.updateUI();
}
});
contentPane.add(btnNewButton, BorderLayout.SOUTH);

contentPane.add(new TestPane(), BorderLayout.CENTER);
//contentPane.add(new TestPane(), BorderLayout.CENTER, 1);
}
}
[/Java]

Nun möchte ich, wie sicherlich erkennbar, per Knopfdruck das JTextPane entfernen und ein anderes darstellen lassen.
Hier dazu die Klasse:

[Java]
package gui;

import javax.swing.JPanel;
import javax.swing.JTextPane;

public class TestPane extends JPanel {

private static final long serialVersionUID = 1L;

public TestPane() {
initA();
}

private void initA() {
JTextPane txtPaneA = new JTextPane();
txtPaneA.setText("bla bla bla");
add(txtPaneA);
}

private void initB() {
removeAll();
JTextPane txtPaneB = new JTextPane();
txtPaneB.setText("test test test test");
add(txtPaneB);
updateUI();
}

public void doSmth(String str) {
switch (str) {
case "test" :
initB();
break;

default:
break;
}

}
}
[/Java]

Eigentlich eine ganz simple Sache, dachte ich jedenfals. Nun sitze ich seit 3 Tagen und bekomme es einfach nicht hin. Google und andere Foren sagen mir dauernd die magischen Wörter:" du musst das Frame neu painten". Mit "validate(), revalidate(), repaint(g), updateUI(), pack()" und haste nicht gesehen, funktioniert es nicht.

Ich habe sogar einen eigenen Lösungsansatz für die Problematik und denke sogar inzwischen verstanden zu haben, wieso es nicht geht. Meine Lösung (oder doch nur ein Workaround?) für das Problem ist, dass ich, wie am auskommentierten Teil zu erkennen, die Textfelder direkt in der TestFrame.class per [c]contentPane.add(new TestPane(), ..., ...)[/c] setze und auch entferne. Eigentlich möchte ich das aber gar nicht, da ich dann von vornherein alles in einer Klasse lassen kann, da ich momentan nicht weiß, wie ich dann das zweite TextPane setzen kann. Es befindet sich ja nur theoretisch in der TestPane.class. Praktisch wird es erst durch die doSmth methode aufgerufen. Meine Lösungsidee wäre hierfür mittels return das TextPane übergeben lassen, aber das habe ich bisher nicht testen können, da mir das gerade eben erst eingefallen ist und jetzt keine Zeit habe es zu probieren. Auch habe ich das bisher noch nicht gemacht. Am liebsten wäre mir jedoch "meine" Methode, mittels alleiniger Veränderung in dem JPanel von TestPane.

Meine Gedanken warum es so nicht geht:
Ich vermute, da GUI Komponente in der Regel statisch sind, dass sich das Fenster den Button + txtPaneA holt und diese auch korrekt darstellt. Nun wird mittels switch-case das JPanel von TestPane gelöscht und mit txtPaneB ersetzt und vermutlich auch mit updateUI(); neu gerendert, aber das JFrame selbst erfährt von der Veränderung nichts. Allerdings kann ich nicht sagen, warum dann ein Aufruf von contentPane.validate(); bzw. revalidate(); im JFrame die Sache nicht behebt...

Das Minimalbeispiel oben muss laufen, natürlich mit angepasster package Info.

Zu meinem OS:
Ubuntu 12.04, Java7 und Eclipse Indigo

Ich hoffe mir kann jemand etwas Erläuchtung schenken.
 

Blackhole16

Bekanntes Mitglied
hi,

1. dass du java7 nutzt sieht man am switch (String) ;)
2. versuche es statt den JTextPane mal erstmal einfachheitshalber mit JLabels
3. bei JTextPanes kannste einfach mit setText(String str); machen, was du möchtest
4. bei dir nimm einfach mal das removeAll() und remove genau das, was weg soll. Ich erinnere mich, dass ich mal das gleiche Problem hatte.

probiers einfach mal aus

mfg
BH16
 

HimBromBeere

Top Contributor
Also wenn ich das richtig sehe, wird dein tp nicht wirklich verwendet, du rufst zwar seine doSomething()-Methode auf, fügst es aber nie in die GUI ein. Schreib in Zeile 55 doch einfach:
[JAVA=55]contentPane.add(tp, BorderLayout.CENTER);[/code]
damit sollte es dann gehen.
 

CortPoker

Aktives Mitglied
Grüß dich,

im Moment erzeugst du ja das contentPane als dein Panel, lässt aber die Klasse TestPane von JPanel erben, das ist schon mal nicht so gut.
Nutz die Instanz von TestPane als Panel, und setz den Button da drauf. Habs grad schnell ausprobiert und läuft dann problemlos

Java:
private void init() {
		JButton btnNewButton = new JButton("New button");
		tp.add(btnNewButton, BorderLayout.SOUTH);
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				tp.doSmth("test");
			}
		});
		this.add(tp);
	}

PS: Wenn der Button nicht nach jedem Klick verschwinden soll, musst du den natürlich noch im Konstruktor von TestFrame dem Panel übergeben und dir dann nur eine Methode schreiben, die die Events verarbeitet.
 
Zuletzt bearbeitet:
Blackhole16 hat gesagt.:
1. dass du java7 nutzt sieht man am switch (String) ;)

Und ich danke Sun dafür, dass das endlich möglich ist. Deshalb nutze ich es auch. Wenn ich das früher gehabt hätte, wäre viel Arbeit erspart geblieben, da mein damaliger Informatiklehrer im Abitur sehr verschachtelte if-else nicht leiden konnte (was ich verstehen kann). Aber als Neuling war es damals natürlich bequem x) und von Optimalität und Speicherbelastung hat sowieso keiner geredet. Da zählte die Lösung und man bekahm höchstens ein Punkt abzug bei unnötigen Verschachtelungen.

3. bei JTextPanes kannste einfach mit setText(String str); machen, was du möchtest

Ich hätte wohl erwähnen sollen, dass in meinem tatsächlichen Vorhaben das JTextPane durch eine JTable ersetzt werden soll. Die Methode mit setText kenne ich nämlich und wurde schon reichlich verwendet.

HimBromBeere hat gesagt.:
damit sollte es dann gehen.

Ich komm mir grad so dumm vor. Der Sinn an [c]private TestPane tp = new TestPane();[/c] war eben genau dieser, dass ich [c]contentPane.add(tp, BorderLayout.CENTER);[/c] machen kann. Irgendwie muss ich das völlig vergessen haben. Hatte nämlich zuvor ein böses Anfängerproblem mit static (schande über mich). Durch das viele rumprobieren habe ich vermutlich einfach nicht mehr an das simpelste gedacht. So klappt es auch in meinem Projekt, da hab ich dass auch vergessen. Aber dann habe ich doch sogar mit meiner Vermutung recht oder?

CortPoker hat gesagt.:
Grüß dich,

im Moment erzeugst du ja das contentPane als dein Panel, lässt aber die Klasse TestPane von JPanel erben, das ist schon mal nicht so gut.
Nutz die Instanz von TestPane als Panel, und setz den Button da drauf. Habs grad schnell ausprobiert und läuft dann problemlos

Grüße dich zurück,

klappt und kann ich dir ohne ausprobieren bestätigen, da ich den Fall erst Vorgestern hatte. Problem ist nur, dass der SOUTH und WEST Bereich im GUI fest belegt ist eben mit einer Infoleiste + Aktionsleiste und diese Leisten sich auf das "Hauptpanel" im CENTER auswirklen sollen. In meinem Projekt ist außerdem ein DropDown Menü was z.B. das wechseln im "Hauptpanel" verursacht. Das ist zur Zeit zb. die Fenstergröße, Einstellungen bzgl. Sound und Musik usw.
Ein Punkt sollte eben eine Initialisierung des eigentlichen Inhalts gewährleisten, praktisch wie das erstellen eines neuen Dokuments in LibreOffice Writer oder ähnlichen Programmen (nur das da ja nicht das Vorherige gelöscht wird...).

Ich glaube ich hätte mehr erklären sollen. :oops:

Ich danke euch für die rasche Hilfe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Erste Schritte JFrame Inhalte werden nicht angezeigt Java Basics - Anfänger-Themen 8
fragenÜber(fragen); Turtle Grafik mit GUI (JFrame) Java Basics - Anfänger-Themen 3
E JFrame + Buffer-strategy Java Basics - Anfänger-Themen 8
I JFrame / Screen auf zweitem (definiertem) Monitor öffnen Java Basics - Anfänger-Themen 3
luggas89 Mit Jframe live zeichnen Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
B HSQL mit JFrame steuern Java Basics - Anfänger-Themen 4
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
D Erste Schritte png in JFrame anzeigen? Java Basics - Anfänger-Themen 3
Thomathy Interface Wie schließt man ein anderes JFrame Fenster? Java Basics - Anfänger-Themen 6
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
S Kontrollieren ob jframe disposed ist Java Basics - Anfänger-Themen 3
Elyt JFrame in den Hintergrund verschieben Java Basics - Anfänger-Themen 3
OSchriever JFrame-Anwendungsfenster verschieben Java Basics - Anfänger-Themen 17
M Bild in JFrame Java Basics - Anfänger-Themen 1
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
CptK Interface Klasse Frame (extends JFrame) aus anderer Klasse schließen Java Basics - Anfänger-Themen 7
S JFrame mit Hintergrundbild und Button Java Basics - Anfänger-Themen 4
S JFrame Java Basics - Anfänger-Themen 15
I JFrame proportional verkleinerbar machen Java Basics - Anfänger-Themen 3
B Java JFrame zeichnen Java Basics - Anfänger-Themen 4
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
T Auslagern von Methoden bei einem JFrame Java Basics - Anfänger-Themen 6
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
J JFrame Fenster öffnet sich nicht Java Basics - Anfänger-Themen 7
3 JFrame immer im Hintergrund Java Basics - Anfänger-Themen 1
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
R JFrame nicht verschiebbar Java Basics - Anfänger-Themen 2
T Wenn JFrame Textfelder Hintergrund Grün dann... (if) Java Basics - Anfänger-Themen 3
K Java JFrame mit Hintergrundbild erstellen Java Basics - Anfänger-Themen 1
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
H Eclipse JFrame Java Basics - Anfänger-Themen 3
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
I JFrame minimieren wenn anderes Programm minimiert wird Java Basics - Anfänger-Themen 1
K Methoden Methode starten wenn JFrame geöffnet wird Java Basics - Anfänger-Themen 2
A Variablen In anderer Klasse auf Objekte von JFrame zugreifen Java Basics - Anfänger-Themen 1
B Ist MyFrame oder JFrame besser? Java Basics - Anfänger-Themen 3
Y JFrame sichtbarkeit Java Basics - Anfänger-Themen 4
KeVoZ_ Label auf JFrame willkürlich Positionieren Java Basics - Anfänger-Themen 2
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
P JFrame nur einmal öffnen Java Basics - Anfänger-Themen 4
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
V Tastatur initialisieren JFrame Probleme Java Basics - Anfänger-Themen 6
J JPG in JFrame anzeigen lassen Java Basics - Anfänger-Themen 3
J JFrame ausgabe von Werten Java Basics - Anfänger-Themen 9
F GUI als Klasse oder extend JFrame? Java Basics - Anfänger-Themen 6
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
L [JFrame] Exception - woher? Java Basics - Anfänger-Themen 8
thomasbomme Grafikfehler JFrame- Cleartype Java Basics - Anfänger-Themen 1
GreyFox Arbeit mit JFrame Java Basics - Anfänger-Themen 8
T Erste Schritte 2 Codes zusammen fügen / Label in JFrame Java Basics - Anfänger-Themen 1
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
N Input/Output Wenn kein Input, dann Fehler anzeigen lassen im JFrame Java Basics - Anfänger-Themen 6
W 2 JPanels in 2Klasse in einem JFrame zusammenfügen Java Basics - Anfänger-Themen 12
dat_vin JFrame öffnet sich mehrmals Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
M Rahmen für undekorierten JFrame Java Basics - Anfänger-Themen 6
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
B Erste Schritte JFrame in Klasse auslagern Java Basics - Anfänger-Themen 4
H JFrame komplett schließen Java Basics - Anfänger-Themen 3
S Brauche hilfe bei Pong (JFrame) Java Basics - Anfänger-Themen 2
M hintergrund in jframe festlegen Java Basics - Anfänger-Themen 4
J JFrame Render Fehler - Warum? Java Basics - Anfänger-Themen 2
I komponenten werden in JFrame nicht richtig angezeigt Java Basics - Anfänger-Themen 1
E 2. JFrame erkennt 1. Frame Java Basics - Anfänger-Themen 6
D Best Practice JFrame im JFrame Java Basics - Anfänger-Themen 2
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
S Erste Schritte Von JFrame in nächstes JFRame wechseln Java Basics - Anfänger-Themen 0
V JFrame aktualisieren Java Basics - Anfänger-Themen 6
S JFrame ist nicht schwarz Java Basics - Anfänger-Themen 5
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
S JFrame wird nicht "bemalt" Java Basics - Anfänger-Themen 2
M Unsichtbare Objekte in JFrame Java Basics - Anfänger-Themen 2
S Textdatei einlesen und JFrame füllen Java Basics - Anfänger-Themen 14
Sogomn JLabel in anderer Klasse zum JFrame hinzufügen Java Basics - Anfänger-Themen 2
B Drawline wird auf JFrame nicht angezeigt Java Basics - Anfänger-Themen 3
N Fokus setzen nachdem JFrame in Vordergrund geholt wurde Java Basics - Anfänger-Themen 7
K Methoden Objekt auf JFrame zeichnen Java Basics - Anfänger-Themen 16
S JFrame leeren Java Basics - Anfänger-Themen 6
X JFrame Fenster einzeln schließen Java Basics - Anfänger-Themen 2
J Klick auf Button -> JFrame öffnet sich erneut. & Datei lässt sich nicht löschen Java Basics - Anfänger-Themen 7
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
P JFrame Component automatische Größe verhindern Java Basics - Anfänger-Themen 2
D JFrame, Komponenten verschmiert. Java Basics - Anfänger-Themen 15
M Schriftfarbe in JFrame Java Basics - Anfänger-Themen 24
A JFrame läuft ewig? Java Basics - Anfänger-Themen 2
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
B Wie kann man auf das JFrame einer anderen Klasse zugreifen, etwas hinzufügen und entfernen?? Java Basics - Anfänger-Themen 3
N JFrame-Objekt in neuer Methode nicht verfügbar? Java Basics - Anfänger-Themen 3
A Frage zu: JFrame setLocationRelativeTo Java Basics - Anfänger-Themen 3
N Erste Schritte Prozessor Kernanzahl in JFrame Java Basics - Anfänger-Themen 3
DStrohma Transparenter JFrame Java Basics - Anfänger-Themen 3
R JFrame über einen JPanel Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben