Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen

sysOut

Mitglied
Hallo erstmal :meld:

Ich hätte da ne Frage zum JFrame und JPanel, speziell zur repaint() und paintComponent()...

Und zwar habe ich ein JFrame mit einem JPanel Container drin. In dem JPanel is noch ein JButton etc...
Das JPanel zeichnet einen Hintergrund auf das Frame:

Java:
public void paintComponent(Graphics g) {
		
		Graphics2D g2d = (Graphics2D) g;
		Image bg = new ImageIcon("bild.jpg").getImage();
		g2d.drawImage(bg, 0, 0, this);
	}

Jetzt möchte ich, dass wenn ich auf den JButton klicke, dass dann quasi ein neues Panel gezeichnet wird, so als würde man auf eine neue Seite verlinkt (von der Funktion her). Habs jetzt so, dass das JPanel aus dem Frame gelöscht wird und ein anderes JPanel hinzugefügt wird und sich dieses dann mit repaint neuzeichnen soll...Dazu hab ich das JFrame als ActionListener zum JButton hinzugefügt...
Wenn ich auf den Button klicke wird die Methode des JFrame aufgerufen

Java:
public void actionPerformed(ActionEvent e) {
		
	        getContentPane().add(chatwindow);
		getContentPane().remove(chatpanel);
		System.out.println(this.getContentPane().getComponentCount());

		repaint();
	}

Leider funktioniert das nicht, da die Methode aus einer Instanz vom zu löschenden Panel aufgerufen wird, denke, dass es daran liegt. Die PaintComponent Methode vom neuen JPanel wird nicht mehr aufgerufen..


Hoffe ihr könnt mir helfen, oder einen besseren Vorschlag machen, denn so kann es nicht gehen...

Gruß
 
Zuletzt bearbeitet von einem Moderator:

sysOut

Mitglied
hm cool danke, das muss ich mal ausprobieren...das dumme ist, dass ich nur die gängigsten Layouts wie Box, Flow oder Border Layout kenne...das werde ich mal ausprobieren...
 

Paddelpirat

Bekanntes Mitglied
Das Layout ist wahrscheinlich schöner zu benutzen, wenn du an der gleichen Position ein neues Panel haben möchtest. Hier noch etwas Beispielcode, wenn du es noch nicht selbst gesehen hast. Ist gar nicht so kompliziert:
CardLayout (Java 2 Platform SE v1.4.2)

Ansonsten noch eine kurze Bemerkung zu deinem Code:

Du addest zuerst das neue Panel und dann entfernst du das alte, das ist schon einmal schlecht ;-)
Außerdem solltest du, wenn du in einem ActionListener etwas am Layout änderst, die EventQueue nutzen. Also so etwas wie:

Java:
public void actionPerformed(ActionEvent e) {
        EventQueue.invokeLater(new Runnable() {
                public void run() {
                        getContentPane().remove(...);
                        ...
                }
        });
}

Für genauere Infos empfehle ich die Java Doku :)

Aber ich glaube du solltest dir trotzdem mal das CardLayout anschauen.
 

L-ectron-X

Gesperrter Benutzer
Die Alternative zu CardLayout wäre:
Java:
remove(oldPanel);
add(newPanel);
validate(); //nicht repaint()
Bei wenigen Panels, die ausgewechselt werden sollen, geht das noch. Wenn es mehr werden, ist diese Lösung nicht sehr elegant.
 

sysOut

Mitglied
Die Alternative zu CardLayout wäre:
Java:
remove(oldPanel);
add(newPanel);
validate(); //nicht repaint()
Bei wenigen Panels, die ausgewechselt werden sollen, geht das noch. Wenn es mehr werden, ist diese Lösung nicht sehr elegant.

Danke, das hat geholfen..aber eins geht noch nicht. Wenn dann das neue panel hinzugefügt wird, kann ich im JTexField nicht gleich schreiben, ich muss erst mit der maus in das feld kliclen...hab aber request Focus() und enterTextField.getCaret().setVisible(true); aufgerufen...


@Paddelpirat warum is das schlecht? Du meinst, ich sollte erst das alte entfernen und dann ein neues hinzufügen?
 
Zuletzt bearbeitet:

Paddelpirat

Bekanntes Mitglied
Hmm, habs gerade mal ausprobiert. Kannst es so machen wie L-ectron-X schreibt. Da macht die Reihenfolge anscheinend auch keinen Unterschied.
 

sysOut

Mitglied
Hmm, habs gerade mal ausprobiert. Kannst es so machen wie L-ectron-X schreibt. Da macht die Reihenfolge anscheinend auch keinen Unterschied.

weiss du vllt warum im neuhinzugefügten JPanel, der Kursor nicht im JTextfield blickt bzw. man nicht gleich drauf losschreiben kann?? im ersten Panel, also bevor ich es mit remove entferne gehts...das erste Panel hat aber 2 JTextFields und das zweite Panel, also das ich dann hinzufüge nur eins...
 

Paddelpirat

Bekanntes Mitglied
Lustig, bei einem Schnelltest spielte hier die Reihenfolge des oben angesprochenen entfernen und hinzufügen der JPanels eine Rolle.

Bei mir klappt es, wenn man halt zuerst das neue Panel hinzufügt und anschließend das alte löscht. Frag mich bitte nicht wieso.
 

sysOut

Mitglied
Hole dir den Focus ins Textfeld. Schreibe nach dem
Code:
validate();
Folgendes:
Java:
textfield.requestFocus();

hm...muss erst das Textfield ausm JPanel chatwindow bekommen....probiers jetzt mal

Java:
public void actionPerformed(ActionEvent e) {
		
		getContentPane().remove(chatpanel);
		getContentPane().add(chatwindow);
		
		System.out.println(this.getContentPane().getComponentCount());

		validate();
		getContentPane().getComponent(0).requestFocus();
		
//		repaint();
	}
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
sysOut hat gesagt.:
Java:
getContentPane().getComponent(0).requestFocus();
Bist du dir sicher, dass an Indexposition 0 dein Textfeld abgelegt ist?

BTW kannst du seit Java 1.5 auf
Code:
getContentPane()
verzichten.
 

sysOut

Mitglied
hm komisch, wenn ich mir das Component ausm JFrame hole, bekomme ich ein JRootPane und nicht das Objekt meiner KLasse ChatWindow...

Java:
public void actionPerformed(ActionEvent e) {
		
		getContentPane().remove(chatpanel);
		getContentPane().add(chatwindow);
		
		System.out.println(this.getContentPane().getComponentCount());

		validate();
		
		System.out.println(getComponent(0).getClass());

		
		
//		repaint();
	}

ich steck ein chatwindow rein.. und bekomm ein JRootPane raus...castet der da was...
chatwindow is aus der Klasse ChatWindow extends JPanel...

in der ChatWindow Klasse bekomme ich mit getComponent(1) das JTextField
 

L-ectron-X

Gesperrter Benutzer
Schreib dir doch einfach eine Methode in dein chatwindow, in der du dem Textfeld den Focus gibst und welche du dann von außen aufrufst.
Bspw.
Java:
public void setFocusOnTextField() {
   textfield.requestFocus();
}
 

Paddelpirat

Bekanntes Mitglied
ja das habe ich dann gemacht...aber warum kann ich es nicht ausm Frame holen mit getComponent(0)
hab ja nur das chatwindow JPanel drin??

Weil du mit dem getComponent(0) das JPanel, bzw. die JRootPane (chatwindow) bekommst und das ist ein Container, der wiederum eigene Komponenten enthält. Daher müsstest du sowas machen wie
Code:
((Container)getComponent(0)).getComponent(0);

Aber sowas solltest du besser vermeiden, weil es unschön ist und sehr schnell unübersichtlich wird.

Eine Alternative zu der set-Methode wäre noch in der Klasse chatwindow folgenden Code hinzufügen:

Java:
       addComponentListener(new ComponentAdapter() {
            
            @Override
            public void componentShown(ComponentEvent e) {
                textField.requestFocus();
            }
        });

Sobald das Panel sichtbar wird, erhält das TextFeld den Focus. Das klappt jedenfalls in meinem Testprogramm mit dem Card-Layout ganz gut.
 
Zuletzt bearbeitet:

sysOut

Mitglied
hm das mit dem Container Cast funktioniert irgendwie auch nicht bei mir...

Java:
System.out.println(((Container)getComponent(0)).getComponent(0).getClass());

da bekomme ich irgendein JPanel...und kein Objekt meiner Klasse ChatWindow

und bei

Java:
System.out.println(((Container)getComponent(0)).getComponent(1).getClass());

Kommt ein JLayeredPane....

hm...windowbuilder erzeugt aber nix davon, wenn ich mir den code anschaue

Aber danke für die anderen Alternativen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
M Main Frame schließen und neue Klasse aufrufen? AWT, Swing, JavaFX & SWT 2
R Komponente (Frame) in anderer Klasse füllen AWT, Swing, JavaFX & SWT 18
Fragerjava Frame inhalt komplett löschen AWT, Swing, JavaFX & SWT 4
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
P Swing Zufallsbilder auf Frame ausgeben AWT, Swing, JavaFX & SWT 1
D AWT Wie kann ich ein Frame von einem anderen aus beeinflussen? AWT, Swing, JavaFX & SWT 7
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
C Swing F5 Taste neu laden auf ganzen Frame AWT, Swing, JavaFX & SWT 9
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
H Swing Frame an andere Klassen weitergeben AWT, Swing, JavaFX & SWT 4
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
F Swing Frame nach vorne holen AWT, Swing, JavaFX & SWT 2
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
S Tastatur frame nur nur 1 mal öffnen AWT, Swing, JavaFX & SWT 1
T Swing Java-Frame bei Programmstart NICHT im Vordergrund öffnen AWT, Swing, JavaFX & SWT 2
A Programm nun in ein Frame basteln AWT, Swing, JavaFX & SWT 1
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
A Swing GUI - Button soll Frame verändern AWT, Swing, JavaFX & SWT 4
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
Z Swing Frame wird geöffnet, aber ist ohne Inhalt AWT, Swing, JavaFX & SWT 0
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
M Internal Frame in den vordergrund AWT, Swing, JavaFX & SWT 4
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
D Buttons erscheinen nicht auf Frame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
M JavaFX wie kann mann sein frame mit einem Icon fersehen? AWT, Swing, JavaFX & SWT 2
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
P Frame friert ein AWT, Swing, JavaFX & SWT 6
Z Frame mit Rechteck! AWT, Swing, JavaFX & SWT 16
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
M Swing "Frame.setResizable(false);" verschiebt Content? AWT, Swing, JavaFX & SWT 9
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
J JTable aktuallisieren über anderen Frame AWT, Swing, JavaFX & SWT 6
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
B JFrame immer an gleicher stelle auf anderem Frame AWT, Swing, JavaFX & SWT 5
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
D Buttons erscheinen nicht auf dem zweiten Frame AWT, Swing, JavaFX & SWT 4
X Swing Größe eines Fensters JFrame / Frame AWT, Swing, JavaFX & SWT 5
BRoll Frame- Video einbinden machbar? AWT, Swing, JavaFX & SWT 6
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
B Frame always on top nur auf anderem Frame AWT, Swing, JavaFX & SWT 9
S Aufteilung von JPanels in einem Frame AWT, Swing, JavaFX & SWT 13
K Options-Frame integrieren (zum zuschalten und wegschalten wie geht man da ran? AWT, Swing, JavaFX & SWT 7
J Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener) AWT, Swing, JavaFX & SWT 2
N Swing Endlosschleife blockt Frame AWT, Swing, JavaFX & SWT 11
B Swing JDialog modal, aber trotzdem Frame auswählbar AWT, Swing, JavaFX & SWT 2
N Swing Frame ungewollt transparent! AWT, Swing, JavaFX & SWT 2
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
D Neues Frame öffnen - und dazu altes schließen AWT, Swing, JavaFX & SWT 5
Daniel_L Drop von Dateien auf Frame - welche Drop-Location? AWT, Swing, JavaFX & SWT 2
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
C LookAndFeel Frame updated nicht vollständig AWT, Swing, JavaFX & SWT 9
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
J 2 Bereiche im Frame komplett nutzen - Welchen Layoutmanager? AWT, Swing, JavaFX & SWT 3
Z Swing JTextfield auf Frame AWT, Swing, JavaFX & SWT 13
N Swing Frame mit GlassPane und Popup AWT, Swing, JavaFX & SWT 5
L Frame Schließen und neustarten AWT, Swing, JavaFX & SWT 4
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
P Frame "always on top" und welche GUI? AWT, Swing, JavaFX & SWT 5
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
S JMenuBar Frame Abstand AWT, Swing, JavaFX & SWT 3
J Swing Frame öffnen aus Frame mit JButton AWT, Swing, JavaFX & SWT 2
X Alte Frame-Größe beim wiederholten Aufruf AWT, Swing, JavaFX & SWT 5
M erstes Frame wartet auf die Auswertung eines zweiten AWT, Swing, JavaFX & SWT 8
J Frame-Steuerelement AWT, Swing, JavaFX & SWT 2
L Swing Flackern in Frame bei erstem Klick AWT, Swing, JavaFX & SWT 19
F Hintergrundbild im Frame AWT, Swing, JavaFX & SWT 11
S Zeichnen führt zu transparentem Frame AWT, Swing, JavaFX & SWT 6
B Frame im Frame? AWT, Swing, JavaFX & SWT 4
C WindowListener Frame AWT, Swing, JavaFX & SWT 8
P klassenübergreifendes Frame AWT, Swing, JavaFX & SWT 6
B Text soll nich über das Frame hinausgehen AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
Spin JFrame/ Frame Drag and Drop AWT, Swing, JavaFX & SWT 13
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
A Hintergrund von einem Frame ändern AWT, Swing, JavaFX & SWT 3
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
M Im Frame wird nur die Menüleiste erstellt und nicht die Tabelle? AWT, Swing, JavaFX & SWT 3
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
T Mehrere sich bewegende Objekte in einem Frame AWT, Swing, JavaFX & SWT 14
J "Warte Frame" AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben