JLabel zur Laufzeit dynamisch erzeugen

Kros

Mitglied
Hallo Zusammen
Vielleicht kann jemand einem interessierten Anfäger einen Tip geben. Ich konnte bereits einiges durch mitlesen in Foren, sowie mittels Tutorials oder auch der bekannten Insel durchschummeln. Nun komme ich aber einfach nicht weiter, da ich nicht verstehe wo ich suchen muss.

Was?
JLabel und JTextField während der Laufzeit erstellen und diese dann in einem JPanel anzeigen lassen.

Wozu?
Erstens zum Üben und zweitens will ich:
Aus einer JavaDB eine Tabelle auswählen (Über eine JComboBox)  Das hab ich
Die ausgewählte Tabelle im Fenster anzeigen lassen  Das hab ich
Pro Tabellenspalte ein JLabel und ein JTextField anzeigen.  Das geht nicht.

Stand?
Ich versuche aktuell nur die JLabel anzuzeigen, wenn das funktioniert sollte das JTextField kein problem mehr darstellen. Zur auswahl habe ich mal zwei Tabellen erstellt, eine mit 2 Spalten, die andere mit 3 spalten. Diese kann ich über die JComboBox auch wählen, und die Tabellen werden dann auch korrekt angezeigt. Nur die JLabel kommen nicht.

Fehlermeldung?
Gerade aktuell garkeine, wenn ich auf Run klicke. Dann kann ich die Tabelle wählen, diese wird angezeigt, aber die JLabel nicht.
Wenn ich den Debugger laufen lasse und Schritt für Schritt, Zeile für Zeile durchgehe bricht er entweder in der Methode createLabels() ab.

Code:
labels[i] = new JLabel("message" + i); // Source not found

Oder beim nochmaligen Wählen einer Tabelle aus der JComboBox bricht er am Ende des ActionListeners ab:


Relevanter Codeschnippsel

Java:
	private JPanel PanelHaupt;
	private JPanel PanelFelder;
Java:
	public ForTabellen() {
		// Definition der Listener
		action actionListener = new action();

		// Fenster einrichten
		setTitle("SQL Tabellen bearbeiten");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		// Top-Level Layout
		setLayout(new BorderLayout());

		JPanel PanelWahl = new JPanel();
		PanelHaupt = new JPanel();
		JPanel PanelButton = new JPanel();

		add(PanelWahl, BorderLayout.NORTH);
		add(PanelHaupt, BorderLayout.CENTER);
		add(PanelButton, BorderLayout.SOUTH);

Java:
		// PanelHaupt
		PanelHaupt.setLayout(new BorderLayout());

		JScrollPane PanelTabelle = new JScrollPane();
		PanelHaupt.add(PanelTabelle, BorderLayout.NORTH);

		PanelFelder = new JPanel();
		// PanelFelder.setLayout(new GridLayout(2,2));
		PanelHaupt.add(PanelFelder, BorderLayout.CENTER);
		
		// TODO später löschen: JLabel erstellen zum Testen ob das grundsätzlich funktioniert
		JLabel jl = new JLabel("TextLabel ausserhalb der for Schleife");
		PanelFelder.add(jl);
Java:
	private class action implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			strCmbWahl = (String) cmbTabelle.getSelectedItem();

			// SQL String in abhängigkeit vom DropDown erstellen
			strSQL = test.getSQL(strCmbWahl);
			labSQL.setText(strSQL);

			// Tabelle füllen
			try {
				dbFirma.setQuerry(strSQL);
				tbmd = dbFirma.rsToTableModel(dbFirma.getResultSet());
				TabTabelle.setModel(tbmd);
				TabTabelle.repaint();
				drawFelder();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}

	}

	private void drawFelder() {
		// TODO drwaFelder() Methode: Eingabefelder zum Panel hinzufügen führt
		// zu Fehler

		// Panel und Felder erzeugen
		Spaltenanzahl = dbFirma.getSpaltenAnzahl();
		try {
			JLabel[] labels = createLabels(Spaltenanzahl);
			for (int i = 0; i < labels.length; i++) {
				PanelFelder.add(labels[i]);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

	private JLabel[] createLabels(int Anzahl) {
		Anzahl = Spaltenanzahl-1;
		JLabel[] labels = new JLabel[Anzahl - 1];
		for (int i = 0; i < Anzahl - 1; i++) {
			labels[i] = new JLabel("message" + i);
		}
		return labels;
	}
 
Zuletzt bearbeitet:
Wenn du ein JLabel bzw. JComponent in ein JPanel hinzufügen willst, machst du das mit
panel.add(Component com) anschließend musst du das Panel neu rendern. Also panel.updateUI().

Das sollte eigendlich schon alles sein...
 
Danke, hatte schon Vorfreude... hat aber nichts gebracht.

Ich gehe davon aus dass:

[JAVA=46] labels = new JLabel("message" + i);[/code]

dazu führt dass nichts passiert.

Weitere Ideen?
 
Ohne das ich jetzt überheblich tue, sollte es aber doch gehen, oder hab ich was nicht verstanden.
Soweit ich das verstanden habe spielt es keine Rolle ob die eckigen Klammern Nach dem Typ, oder nach dem Variabelnnamen stehen.

Code:
JLabel[] labels = new JLabel[5]
ist gleich wie
Code:
JLabel labels[] = new JLabel[5]

Aus dem Forum:
Java:
Datensatz datensaetze[] = new Datensatz[6];
datensaetze[0] = new Datensatz("Foo", "Oof", 123);
datensaetze[1] = new Datensatz("Bar", "Rab", 456);
datensaetze[2] = new Datensatz("Foobar", "Raboof", 789);

Aus meinem Quellcode:
Java:
JLabel labels[] = new JLabel[Anzahl - 1]; // Anzahl ist eine Instanzvariabel
// ... Hier steht noch etwas Code
labels[i] = new JLabel("message" + i);
 
Moin,

Aus meinem Quellcode:
Java:
JLabel labels[] = new JLabel[Anzahl - 1]; // Anzahl ist eine Instanzvariabel
Das ist auch ok, damit legst Du ein Array mit "Anzahl - 1" Elementen an ....

Java:
labels[i] = new JLabel("message" + i);
Dies ist aber Quark!
Es gibt keinen Konstruktor mit diesen Parametern "new JLabel( String + int )";
Deshalb kommt da wohl auch deine Fehlermeldung!

Was hast Du denn da überhaupt vor ?

Gruß
Klaus
 
Zuletzt bearbeitet:
Ich hab auch schon versucht dem Konstruktor nur einen String zu übergeben. Das Ergebnis hat sich aber nicht verändert.
Code:
labels[i] = new JLabel("message");

Aktuell will ich einfach einpaar JLabels erstellen und zwar genau soviele wie meine Tabelle Spalten hat. Wenn das funktioniert will ich noch Textfelder erstellen um neue Datensätze der Tabelle hinzuzufügen.

Will mit dem Zeugs einfach einbisschen ausprobieren, verbessern neues lernen.

Hast du vielleicht ein Beispiel?
 
So was von doof... das ganze funktioniert. Ich konnte das Label einfach nicht sehen. Erst als ich mein Fenster unten vergrössert habe wurde das Label sichtbar.

Danke für die Hilfe.

Gruss
 

Neue Themen


Zurück
Oben