Aufruf einer Klasse in einem Package

Quax

Mitglied
Ich, ein Java-Neuling, möchte ein Fenster gestalten mit folgenden Code:
Java:
package compmix1;
import java.awt.Component;
import javax.swing.JFrame;
import javax.swing.JPanel;
import compmix2.Visual22;

public class Visual11 extends JFrame
{
//	private JPanel Platte = new JPanel ();

	// Konstruktor
	public Visual11()
	{
		super("Fenster");
		JPanel Platte = new JPanel ();
		Visual22 Anzeige = new Visual22();
		Platte.add(Anzeige);
		setContentPane (Platte);
	}
	public static void main(String[] args) 
	{
		Visual11 thisClass = new Visual11();
		thisClass.setSize(200, 300);
		thisClass.setDefaultCloseOperation(EXIT_ON_CLOSE);
		thisClass.setVisible(true);
	}

}
Darin sollen Texte, Buttons, Eingabefelder und Kontrollkästchen etc. erscheinen. Aus Gründen der Übersicht möchte ich dazu separate Klassen in Packages stellen. Diese Klassen will ich dann aus dem "Main-Code" (siehe oben) aufrufen und wie in diesem Beispiel soll dann der Text angezeigt werden.
Hier die Klasse in einem separaten Package zur Anzeige des Textes:
Java:
package compmix2;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Visual22 extends JLabel
{
	private JLabel jLabel = new JLabel();
		
	public void setzeText()
	{
		jLabel.setText("Textanzeige");
		jLabel.setSize(30,20);
		jLabel.setVisible(true);
	}
}
Wenn ich jetzt das kleine Programm ausführe wird nur das Fenster mit dem Titel "Fenster" angezeigt, nicht jedoch darin der Text "Textanzeige" aus der Klasse Visual22.
Wie ich aus einigen Beispielen gelernt habe, "pinnt" man wohl diesen JLabel an ein JPanel, hier "Platte" und verbindet dieses JPanel dann mit dem eigentlichen Fenster.

Fragen:
1. Was hab ich falsch gemacht?
2. Wie muss der Code aussehen, dass es funktioniert?
3. Wie muss der Code aussehen, dass ich im Main-Code den Text an die Klasse Visual22 übergeben kann und dieser dann im Fenster angezeigt wird? Denn letztendlich will ich dann nur einen Text vom Main-Code an die z.B. gleiche Textklasse Visual22 übergeben.

Vielen Dank im Voraus
Quax
 
1. Was hab ich falsch gemacht?
Du hast ein Label erstellst, es aber nirgends hinzugefügt. Das muss natürlich aufs Panel
2. Wie muss der Code aussehen, dass es funktioniert?

3. Wie muss der Code aussehen, dass ich im Main-Code den Text an die Klasse Visual22 übergeben kann und dieser dann im Fenster angezeigt wird? Denn letztendlich will ich dann nur einen Text vom Main-Code an die z.B. gleiche Textklasse Visual22 übergeben.

Erstmal Grundlagen anlernen/lesen bevor du weiter machst :bae:
Dann das Swing Kapitel lesen (du mischst hier AWT mit Swing usw..) und dann erneut fragen 🙂
 
um genauer zu werden: Visual22 ist selber ein JLabel und enthält noch ein JLabel, das macht 2 JLabel,
eines bekommt den Text, das andere wird derzeit angezeigt
 
Den Main-Code hab ich folgendermaßen abgeändert:
Java:
package compmix1;
import javax.swing.JFrame;
import javax.swing.JPanel;
import compmix2.Visual22;

public class Visual11 extends JFrame
{
//	private JPanel Platte = new JPanel ();

	// Konstruktor
	public Visual11()
	{
		super("Fenster");
		JPanel Platte = new JPanel ();
		Visual22 Anzeige = new Visual22();
		Platte.add(Anzeige.jLabel);
		setContentPane (Platte);
	}
	public static void main(String[] args) 
	{
		Visual11 thisClass = new Visual11();
		thisClass.setSize(200, 300);
		thisClass.setDefaultCloseOperation(EXIT_ON_CLOSE);
		thisClass.setVisible(true);
	}
}
Und in der separaten Klasse habe ich nun extends JLabel entfernt und die Kapselung auf public gesetzt. Sie sieht in dem Package nun so aus:
Java:
package compmix2;
import javax.swing.JLabel;

public class Visual22
{
	public JLabel jLabel = new JLabel();
	
	public void setzeText()
	{
		jLabel.setText("Textanzeige");
		jLabel.setSize(30,20);
		jLabel.setVisible(true);
	}
}
Der Compiler zeigt keine Fehler an. Doch weiter wird nur das Fenster "Fenster" angezeigt ohne dem gewünschten Text.
 
Zuletzt bearbeitet:
mein Posting mit den zwei JLabel gesehen?
darüber erstmal sinieren und dann entscheiden welches JLabel es denn sein soll,

> Platte.add(Anzeige.setzteText);
läßt an Kenntnissen und allgemeinen Programmierfähigkeiten arg zweifeln, was hast du dir denn dabei gedacht?
nur sinnvolle Befehle sind auch sinnvoll, man kann nicht nach Beliebigkeit eintippen
jFrame.reagiereSchnell();
 
Hallo SlaterB,
ja das habe ich gesehen und auch eingearbeitet. Siehe Posting oben. Ja meine Programmierkenntnisse in OOP sind sehr beschränkt darum bin ich auch hier im Anfängerforum.
Nun meine Idee dabei war die Methode "setzeText" in der der Text definiert ist über das Objekt Anzeige, welches ein Objekt der Klasse Visual22 ist, aufzurufen und diese an das JPanel "Platte" zu pinnen. Und das JPanel "Platte" wird dann in dem Fenster angezeigt.
Was ist daran falsch?
Quax
 
> Der Compiler zeigt keine Fehler an. Doch weiter wird nur das Fenster "Fenster" angezeigt ohne dem gewünschten Text.

setzeText() wird nie aufgerufen?

> Nun meine Idee dabei war die Methode "setzeText" in der der Text definiert ist über das Objekt Anzeige, welches ein Objekt der Klasse Visual22 ist, aufzurufen [..] Was ist daran falsch?

eine Methode kann man gerne aufrufen, aber nicht erwarten dass auf magische Weise dann irgendein JLabel irgendwohin wandert,
alles muss seinen strukturierten Lauf nehmen, z.B. könnte setzeText() das JLabel als Rückgabewert liefert, dann ginge in der Richtung schon einiges,
wenn auch eher unschön, setzeText() klingt nicht nach Rückgabe, lieber für sich aufrufen und das JLabel so einfügen, wie du es schon hast
 
du könntest auch die variante mit dem extends JLabel nehmen ...
außerdem fehlt der konstruktor
und mit super() wäre das auch einfacher

wie bereits erwähnt : eigne dir erstmal grundlagen an
das ist ja grauenvoll
 

Zurück
Oben