Java repaint-Methode

Unten folgt der Quelltext für ein kleines Beispielprogramm, das nach einem Klick auf einen Button ein Bild links neben dem Button anzeigen soll.

Mein Problem ist, dass ich es nicht schaffe mit einer repaint-Methode die Oberfläche neu aufzubauen, sodass das Bild angezeigt wird. Die einzige Möglichkeit das Bild nach einem Klick auf den Button doch noch auf den Bildschirm zu zaubern, ist die Größe des Programmfensters mit der Maus zu verändern und die JVM so zu einem repaint zu zwingen.

Ich wäre dankbar wenn Ihr mir sagen könnten wo mein Fehler liegt und wie man die repaint-Methode zu laufen kriegt.

Danke für Eure Hilfe
Zwiggel

####Quelltext#####

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class RepaintTest2_main extends JPanel
{
JFrame HAUPTFRAME;
JPanel PANEL_LINKS;
JPanel PANEL_RECHTS;
JButton BUTTON;
ImageIcon BILD;
JLabel IMGLABEL;

public static void main(String[] args)
{
RepaintTest2_main RT2 = new RepaintTest2_main();
RT2.paint();
}

public void paint()
{
HAUPTFRAME = new JFrame(„Repainttest“);

PANEL_RECHTS = new JPanel();
PANEL_RECHTS.setBackground(Color.darkGray);

BUTTON = new JButton(„Bild laden“);
BUTTON.addActionListener(new Buttonlistener());
PANEL_RECHTS.add(BUTTON);

HAUPTFRAME.getContentPane().add(BorderLayout.EAST, PANEL_RECHTS);

PANEL_LINKS = new JPanel();
HAUPTFRAME.getContentPane().add(BorderLayout.WEST, PANEL_LINKS);

HAUPTFRAME.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
HAUPTFRAME.setSize(800,600);
HAUPTFRAME.setVisible(true);

}

class Buttonlistener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
System.out.println(„Button gedrückt!“);

BILD = new ImageIcon("/home/marcel/testBilder/bild01.jpg");
IMGLABEL = new JLabel(BILD);
PANEL_LINKS.add(IMGLABEL);

HAUPTFRAME.repaint();
}
}
}

Du solltest nicht repaint() aufrufen, sondern revalidate(). Das signalisiert dem Layout-Manager dass die Komponente neu gelayoutet werden muss. Das repainten bringt dir nichts, weil Swing die neu hinzugefügte Komponente erst layouten muss. Es weiß praktisch noch gar nicht, dass du das JLabel hinzugefügt hast, solange das nicht gelayoutet ist. Daher zeichnet repaint() zwar dein Fenster neu, aber eben ohne das Bild.

Statt

HAUPTFRAME.repaint();

machst du deshalb z.B.

PANEL\_LINKS.revalidate();

Und noch ein paar Sachen:

a)
In Java schreibt man Variablen klein. Konstanten werden in GROSS geschrieben. Das macht den Code leichter lesbar und auch leichter schreibbar, da du nicht ständig die Shift-Taste drücken musst.

b)
Wieso hast du deine Klasse von JPanel abgeleitet? Du benutzt sie ja gar nicht als JPanel, also ist das überflüssig.

Java revalidate-Methode
vielen Dank für die schnell Hilfe.

mit revalidate() funktioniert es einwandfrei und danke auch für die beiden anderen Tipps.

Zwiggel