Erneutes problem mit frames und deren aufbau

alsooo,
ja ich habe schon einen Artiekl geschrieben, in dem ging es darum, warum ich einen Fensteraufbau nihct mit Thread.sleep(); aufhalten kann., so dfass er weiter ginge. Bei meinem Code konnte er das Fenster erst komplett nach Thread.sleep() zeichnen.
Die hilfe war naja, weil jetzt habe ich das Problem erneut, niemlich wenn ich eine CheckBox über einen ActionListender selektiere, will ich, das weitere Elemente auf ein JPanel, das auf einem JFrame platz gefunden hat, erscheinen. Es läuft aber nicht und so komme ich langsam darauf, dass cih ein grundlegendes Problem mit Frames habe. Stimmt an meiner herangehensweise etwas nicht, einen Aufbau einfach zu unterbrechen, oder durch IF-Strukturen zu erweitern. Ich sende noch den Code und vielen Dank:

//panel ist ein JPanel , das auf einem JFrame sitzt

//drei Label auf dem JPanel
JLabel label = new JLabel(„Java E-Books“);
label.setFont(new Font(„Dialog“, 0, 50));
label.setForeground(new Color(255,255,255));
panel.add(label, grid1);

JLabel label2 = new JLabel(„Internet-Adresse“);
label2.setForeground( new Color(255,255,255));
panel.add(label2);

JLabel label3 = new JLabel(„E-Book“);
label3.setForeground( new Color(255,255,255));

//Arrays die den Inhalt für die JComboBoxes liefert
String[] url = {"http://www.addisonwesley.de/Service/Krueger/httoc.htm"};
String[] inhalt = { „Guido Krüger - JAVA 1.1 lernen“};

//Zwei JComboBoxes
JComboBox combo1 = new JComboBox();
for ( String s : url ) combo1.addItem( s );
combo1.setPreferredSize(new Dimension(600,20));
panel.add(combo1, grid3);
combo1.addActionListener( new ActionListener() {
@Override public void actionPerformed( ActionEvent e ) {
JComboBox selectedChoice = (JComboBox) e.getSource();
if ( "[http://www.addison-wesley.de/Service/Krueger/httoc.h…](http://www.addison-wesley.de/Service/Krueger/httoc.htm".equals() selectedChoice.getSelectedItem() ) ) {
//!!!Achtung!!!
//hier wöllte ich Code einfügen
//z.B. (nachdem ich die Komponenten auf final // gesetzt): panel.add(label3, grid1);
//funktioniert aber nicht
} } } );

JComboBox combo2 = new JComboBox();
for ( String s : inhalt ) combo2.addItem( s );
combo2.setPreferredSize(new Dimension(600,20));
panel.add(combo2, grid2);

P.S: könntet ihr mir bitte noch erklären, warum ich Objekte immer mit Final deklarieren muss, wenn ich sie in einer inneren Funktion verwenden möchte. Ich verstehe den Syntax nicht ganz genau, weil final ja lediglich eine Veränderung der Komponente zuläßt, was hat das mit einer inneren Methode zu tun???
Merciiiii

Ach, ich versuch’s doch mal.

Ich hab erstmal ein vollständiges Programm aus dem Sourcecode gemacht:

import java.awt.\*;
import java.awt.event.\*;

import javax.swing.\*;

public class Test {

 public static void main(String[] args) {
 final JFrame f = new JFrame();
 f.setDefaultCloseOperation(JFrame.EXIT\_ON\_CLOSE);

 final JPanel panel = new JPanel(new FlowLayout());
 // drei Label auf dem JPanel
 JLabel label = new JLabel("Java E-Books");
 panel.add(label);

 JLabel label2 = new JLabel("Internet-Adresse");
 panel.add(label2);

 final JLabel label3 = new JLabel("NEW LABEL");

 // Arrays die den Inhalt für die JComboBoxes liefert
 String[] url = { "http://www.addisonwesley.de/Service/", "test" };
 String[] inhalt = { "Guido Krüger - JAVA 1.1 lernen" };

 // Zwei JComboBoxes
 JComboBox combo1 = new JComboBox();
 for (String s : url)
 combo1.addItem(s);
 panel.add(combo1);

 final JComboBox combo2 = new JComboBox();
 for (String s : inhalt)
 combo2.addItem(s);
 panel.add(combo2);

 combo1.addActionListener(new ActionListener() {
 public void actionPerformed(final ActionEvent e) {
 JComboBox selectedChoice = (JComboBox) e.getSource();
 Object selectedItem = selectedChoice.getSelectedItem();
 System.out.println(selectedItem + " "
 + selectedItem.getClass().getName());
 if ("test".equals(selectedItem)) {
 // !!!!!!!Achtung!!!!!!
 // hier wöllte ich Code einfügen
 // z.B. (nachdem ich die Komponenten auf final //
 // gesetzt):
 panel.add(new JLabel(selectedItem.toString()));
 panel.validate();
 // funktioniert aber nicht
 }
 }
 });

 f.setContentPane(panel);
 f.setVisible(true);
 }

}

final muss sein, damit die innere anonyme Klasse Annahmen über die Lebensdauer der äusseren Objekte machen kann. Ansonsten kann der ActionListener nicht sicher sein, dass die Objekte noch existieren. Durch final existieren sie so lange, wie die äussere Klasse auch existiert.

Dein Programm hat fast funktioniert, aber Du solltest noch einmal über die Validierung der Oberflächen nachlesen und wann was gezeichnet wird.

Ich verweise jetzt nur auf die SUN Swing Trails oder andere Tutorials.

jaa, danke man
klappt und geht…
merci

Ja, ich weiß.