Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Textlabel aus anderer Klasse ansprechen - Konstruktor notwendig?
Allgemein: Alles was nicht statisch ist, ist objekt-bezogen, d.h. du brauchst auch ein Objekt. Ein Objekt ist eine Instanz einer Klasse, eine Klasse selber ist nur eine Art Handbuch über ein Objekt (zumindest wenn man es objektorientiert sehen will). Eine Instanz erzeugst du per
Code:
new
, also Aufruf eines Konstruktors der Klasse.
Alle statischen Dinge sind sozusagen global "einfach da" in einer Klasse. Das sollte man möglichst vermeiden, sowas nutzt man nur bei zB mathematischen Hilfsfunktionen, wo es keinen Sinn macht ein Objekt zu erzeugen.
Alternativ zu Marco's Vorschlag kannst du auch direkt dein Label in die Methode reinreichen, dann sparst du dir den Setter und die Instanz-Variable. (Wenn du in mehreren Methoden etwas mit dem Label machen möchtest, wäre Marco's Variante wieder besser)
Alternativ zu Marco's Vorschlag kannst du auch direkt dein Label in die Methode reinreichen, dann sparst du dir den Setter und die Instanz-Variable. (Wenn du in mehreren Methoden etwas mit dem Label machen möchtest, wäre Marco's Variante wieder besser)
JLabel meinInstanzLabel = new Klasse2.besagtesLabel();
meinInstanzLabel.setText("bla");
Java:
JLabel
gibt an um was für einen Typ (richtig formuliert?) es sich handelt, korrekt??
Java:
meinInstanzLabel
ist einfach nur der neue Variablenname für das Label in meiner Klasse1
Java:
new Klasse2.besagtesLabel();
Ich glaub an der Stelle lieg ich total daneben. Muss ich hier nicht auf das besagteLabel in Klasse2 zugreifen? wobei die Klammern () ja eigentlich auf ne Methode hinweisen...?? aber das Label ist ja keine Methode?
Wieso "neuer" Variablenname - Es ist der Name der Variablen, die du hier deklarierst, ja.
Java:
new Klasse2.besagtesLabel();
Ich glaub an der Stelle lieg ich total daneben. Muss ich hier nicht auf das besagteLabel in Klasse2 zugreifen? wobei die Klammern () ja eigentlich auf ne Methode hinweisen...?? aber das Label ist ja keine Methode?
Also du vermischt hier Konstruktoren mit Methoden. Weisst du was ein Konstruktor ist? Den ruft man mit new auf, und der erzeugt eine Instanz einer Klasse, aber du kannst nicht eine Methode instantiieren. Was du willst* ist ein Methodenaufruf, sprich einfach ohne das "new".
Jetzt hast du allerdings das Problem, dass das so auch nicht gehen wird, da diese Methode wohl nicht statisch ist. D.h. du brauchst eine Instanz der Klasse2, um diese Methode aufzurufen.
Also, wenn du in Klasse X ein Objekt der Klasse Y brauchst, dann solltest du dieses Objekt beim Instantiieren hereinreichen, also im Konstruktor:
Java:
class X{
private JLabel aLabel;
public X(Y y){
aLabel = y.getTheLabel();
}
}
Und ja, getTheLabel() ist nicht das Label, sondern eine Methode in der Klasse Y, die das Label returned:
Java:
// in der Klasse Y
public JLabel getTheLabel(){
return myLabel;
}
Alternativ - * und das ist wohl das, was du wirklichmit deinem Code wohl machen wolltest - kannst du die Sichtbarkeit von "myLabel" in der Klasse y auch so einstellen, dass Klasse X direkt darauf zugreifen kann, zB machst du es public, dann sähe der Konstruktor der Klasse X halt so aus:
Java:
class X{
private JLabel aLabel;
public X(Y y){
aLabel = y.myLabel; // das ist kein Methodenaufruf, sondern ein direkter Zugriff auf eine Variable
}
}
edit: Uuahh naja das war jetzt einigermaßen verwirrend erklärt Ich hoffe du verstehst trotzdem den Unterschied zwischen Konstruktoren-Aufrufen, Methoden-Aufrufen und direkten Zugriffen auf Variablen. Wenn nein frag nochmal nach
Den Unterschied zwischen Variablenaufruf und Methodenaufruf müsste so gehn:
Variablenaufruf: Ich weise in Klasse1 einer Variable1 den Wert einer Variable2 zu die in Klasse2 einen bestimmten Wert hat
Java:
private float Variable1 = Klasse2.Variable2;
Methodenaufruf: In Klasse2 existiert eine Methode die einen Wert zurückgibt. Will ich nun meiner Variable1 in Klasse1 diesen Wert zuweisen mach ich das mit
Java:
private float Variable1 = Klasse2.Methode();
So und nun der Konstruktorenspaß. Hier hast du recht, ich schein da immer noch was mit den Methoden zu vermischen.
Ich hab nen Konstruktor bisher so verstanden, dass er eine Verknüpfung zu einer anderen Klasse herstellt, damit ich deren Methoden nutzen kann. Und dazu muss ich zuerst eine Instanz erschaffen. Eine Instanz ist eine Methode in meiner Klasse1, die die "Eigenschaften" der Methode aus Klasse2 erhält. Ich erschaffe sozusagen in Klasse1 eine Abbildung der Methode von Klasse2.
Java:
neuerMethodenname = new Klasse2.MethodeAusKlasse2();
Nun kann ich in meiner Klasse1 auf neuerMethodenname immer zurückgreifen und muss nicht immer den Methodenaufruf anwenden.
So stell ich mir das grad vor ^^
Lieg ich da falsch??
Also das mit dem Variablen- & Methodenaufruf stimmt so für den Fall von statischen Variablen und Methoden. Bei nicht-statischen Dingen geht das so nicht, da nicht-statisch heisst: An ein Objekt gebunden. Sprich du brauchst zuerstmal eine Instanz dieser Klasse (Objekt = Instanz).
...das wird vllt verständlicher wenn du das mit den Konstruktoren verstanden hast. Und das hast du leider total falsch verstanden Ein Konstruktor ist keine Methode und hat damit auch gar nix zu tun. Ein Konstruktor erzeugt eine Instanz einer Klasse:
Java:
new Auto();
wäre der Aufruf des Konstruktors in einer Klasse namens Auto, und was da returned wird ist eben eine Instanz der Klasse. Also kurz gesagt: Ein Auto halt. Das ist jetzt ein Objekt, keine Klasse oder Methode.
Und so ein Objekt enthält alle Variablen und Methoden der Auto-Klasse, die nicht statisch sind. Und durch Dereferenzierung (=Punkt-Notation) kannst du auf diese Dinge zugreifen:
Java:
Auto meinAuto = new Auto();
meinAuto.getPs();
// oder meinAuto.ps, falls diese Variable sichtbar ist
Hm..also.. es ist extrem wichtig dass du den Unterschied verstehst zwischen Klassen und Instanzen, und zwischen Konstruktoren und Methoden. Und zwischen statischen und nicht-statischen Dingen. Es gibt hier in der FAQ dazu auch allerhand Dinge, im Abschnitt "Einführung und erste Schritte".