Java Suche Fehler bei der GUI-Programmierung (FormLayout)

nintendoluk

Commander
Registriert
Mai 2014
Beiträge
2.124
Hi zusammen,

ich habe mittels dem WindowDesigner (Eclipse Plugin) mir eine Form zusammengestellt. Diese habe ich jedoch abändern müssen, da die Anzahl der Labels von einer Datei abhängt, welche erst mittels Buttondruck ausgelesen wird.

Die Schleife mit der die Labels erstellt werden habe ich also in das ActionEvent eines Buttons reingepackt.
Jedoch wird diese beim Drücken des Buttons zwar ausgeführt, die GUI-Bausteine, die erstellt werden sollen, erscheinen aber nicht. Es wird auch kein Error o.ä. angezeigt.

Wenn ich die Labels außerhalb des ActionEvents anzeigen lasse, funktioniert alles Wunderbar.

Zur besseren Verständnis hier mein kompletter Quellcode (vielleicht ist der Fehler ja ganz woanders):

Code:
package my.java.demo.prog1;

import java.awt.EventQueue;

public class GridMenu {

	private JFrame frame;
	private final JButton btnOk = new JButton("OK");
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					GridMenu window = new GridMenu();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public GridMenu() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 458, 489);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(new FormLayout(new ColumnSpec[] {
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("default:grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				FormFactory.DEFAULT_COLSPEC,
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(25dlu;default)"),
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(27dlu;default):grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(26dlu;default)"),
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(81dlu;default)"),},
			new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("max(199dlu;default)"),
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("default:grow"),}));
		
                /*******************************
                 * Ab Hier wird's Interessant  *
                 *******************************/

		JButton btnBrowseCsv = new JButton("Browse CSV...");
		btnBrowseCsv.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				System.out.println("Start Browse CSV...");
				
                                //Wird nicht gemacht:
				JLabel lblC = new JLabel("C:\\ABC\\LMN\\XYZ.csv");
				frame.getContentPane().add(lblC, "4, 1, 9, 1"); 
				
				
				int iAnzahl = 5; //readCSV()
				
				for(int i = 0; i < iAnzahl; i++)
				{

					System.out.println(i);
					
                                        //Wird nicht gemacht:
					JLabel lblN = new JLabel("Wir sind bei Nummer: "+ i);
					frame.getContentPane().add(lblN, "4, "+(2+i)+", 9, 1"); 
				}
				
			}
		});
		frame.getContentPane().add(btnBrowseCsv, "2, 2");

		
	}

}

Bis auf die Konsolenausgaben ist es aktuell so, dass beim Buttonklick nichts passiert.

Ich hoffe einer von euch hat eine Lösungsidee. Außerdem würde ich mich auch über Tipps freuen, welches Layout besser geeignet wäre.

Danke & Gruß
Lukas

PS: Ich hab Leider keine Zeit mir ein komplettes Tutorial zur GUI-Programmierung anzusehen (Da ich wahrscheinlich nie wieder GUIs machen werde und es Sinnlos wäre mir das anzutrainieren), deshalb nutzt es mir gar nichts wenn Ihr mir Links zu Tutorials sendet ;-) Bitte beachtet das.
 
Bei dynamischen Änderungen des Layouts muss man u.U. selbst für eine Aktualisierung sorgen.

Code:
frame.getContentPane().revalidate();
frame.getContentPane().repaint();
 
max40 schrieb:
versuch mal ein
Code:
frame.validate();
nach dem add.

Yay, danke :-D

Jetzt geht alles! Vielen, Vielen Dank ^^
Ergänzung ()

Bonusfrage:

Wenn der Button jetzt öfters gedrückt wird, sieht das zwar lustig aus, aber das soll es nicht.
Gibt es einen Befehl um die Form zu "resetten", oder darf ich das manuell mit frame.getContentPane().remove(lblC); machen?

EDIT: Bzw. remove(); geht ja gar nicht, da die Zeiger auf die Variablen gelöscht werden (Beim verlassen des ActionEvents)...
Das heißt ich brauche eine Funktion um die komplette Form zu resetten, ansonsten muss ich den Button nach dem Klick verschwinden lassen und das sieht ja auch irgendwo blöd aus...
 
Zuletzt bearbeitet:
dann mach den button nicht mehr anklickbar.

Code:
btnBrowseCsv.setEnabled(false);

falls er meckert mach vor dem
Code:
JButton btnBrowseCsv = new JButton("Browse CSV...");
ein final, also
Code:
final JButton btnBrowseCsv = new JButton("Browse CSV...");
 
Sorry, hab vergessen zu schreiben dass ichs selber gefunden hab^^

Ich habs jetzt so gelöst:

Code:
				System.out.println("removing all...");
				frame.getContentPane().removeAll();
				System.out.println("validating...");
				frame.getContentPane().validate();
				System.out.println("repainting...");
				frame.getContentPane().repaint();
				System.out.println("build new form...");
				
				frame.getContentPane().add(btnBrowseCsv, "2, 2");

Am Anfang des Button-Klick-Events
 
Zurück
Oben