x.setText("") auf JLabel

  • Themenstarter Themenstarter Malcolm
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

Malcolm

Gast
Hallo,

mal angenommen ich hab zwei Klassen, in der einen Klasse hab ich unter anderem ein JLabel erstellt. Nun möchte ich gerne den Text dieses JLabels aus der zweiten Klasse heraus mit Hilfe der Methode setText() verändern. Das Problem ist nun, dass ich nicht weiß, wie ich aus einer anderen Klasse heraus auf diese JLabel zugreifen kann. Wäre super wenn mir einer helfen könnte.

Gruss Malcolm
 
Also auf keinen Fall solltest du das JLabel public machen, so könntest du zwar darauf zu greifen aber andere auch und somit Fehler in dein Programm einbringen. Besser:
Code:
public class ABC {
     private JLabel lbl = new JLabel(); //ohne text

     public JLabel getLabel() {
            return this.lbl;  //gibt ein Label zurück
      }
}

public class XYZ {
     private JLabel  lbl;

     public XYZ() {
          //Ich mach das mal im Konstruktor
          ABC abc = new ABC();
          this.lbl = abc.getLabel();
          lbl.setText("Der Label Text");
     }
}
 
Hallo,

hab den Quellcode getestet. Ich bekomme da eine NullPointerExcetion. Kann ihr mir sagen woran das liegen kann?
 
Die folgende Lösung kapselt das ganze noch besser; so kann man von 'außen' nur noch den Text lesen und schreiben und alle anderen Änderungen am JLabel sind tabu:

Code:
public class ABC {
  private JLabel m_ABCLabel = new JLabel();

  public String getABCText() {
    return this.m_ABCLabel.getText();
  }

  public void setABCText(String s) {
    this.m_ABCLabel.setText(s);
  }

}

public class XYZ {
  public XYZ() {
    //Ich mach das mal im Konstruktor
    ABC abc = new ABC();
    abc.setABCText("Der Label Text");
  }
}
 
wieso ist das besser geschützt? vorher war der Label public, jetzt sind beide Methoden public.
versteh ich nicht....

EDIT: oder ist das weil eine instanz davon erzeugt wird, und auf diese dann nicht mehr zugegriffen werden kann von aussen? *idee bekommen*
 
Also vorher konnte man auf alle öffentlichen Methoden eines JLabels zugreifen (z.B. auch setLocation, setBackground usw.). I. d. R. ist es aber nicht gewollt, dass derartige Objekt-Eigenschaften durch andere Klassen geändert werden sollten.

M. E. sollte Änderungen an GUI-Elemente durch die GUI-Klasse gekapselt sein. Und durch oben vorgeschlagenen Ansatz sind wirklich nur die Eigenschaften änderbar, die auch zur Verfügung stehen sollen für andere.
 
leuchted mir ein 😀

aber wenn nichts an dem Label geändert werden muss, macht es dann auch sinn eine methode getLabel() zu schreiben?

frage das, weis mein GUI bilder das gemacht hat, und ich das sinnlos fand...
 
also mit nichts geändert werden muss hab ich eigentlich gemeint, dass von aussen nichts geändert werden muss 😀

hab erst jetzt gemerkt dass mein satzt nicht so verständlich war...
 
hallo,
also was sky80 gemacht ist vollkommen richtig. dadurch sind die methoden gesperrt wie es oben auch erklärt ist.
nur die beiden notwendigen methoden werden nach aussen sichtbar. so sollte es auch sein.
was ich eigentlich meine ist, dass es schon sinnvoll ist so eine methode zu schreiben, weil man ja im Laufzeit irgendwelche JLabeltexte verändern will, aber nicht die Farben oder Platzierung usw.. Daher ist es die optimale Lösung meiner Meinung nach. Oder?
Gruss
 
ja klar bin ich deiner meinung, aber realistischer weise: was bringt es jemandem wenn er meinen label verändert und ihn dann anschauen kann...
 
dotlens hat gesagt.:
ja klar bin ich deiner meinung, aber realistischer weise: was bringt es jemandem wenn er meinen label verändert und ihn dann anschauen kann...

Ich denke hier stellt sich nicht die Frage nach dem Nutzem sondern nach einem nach OOA/OOD/OOP-sauberem Design von Klassen.
 
sky80 hat gesagt.:
Ich denke hier stellt sich nicht die Frage nach dem Nutzem sondern nach einem nach OOA/OOD/OOP-sauberem Design von Klassen.
genau das meine ich 🙂 ist schon klar, dass so gut wie niemand kommt und versucht deinen JLabel zu verändern.
Es geht nur darum das "property" Prinzip zu beachten. Regel besagt ja auch, dass jede Klasse so wenig wie möglich von den anderen kennen soll.
 
Wenn ich mehrere Labels o.ä. habe mache ich sowas in der Art:

Code:
myObject.set( iObjId, sValue ); // iObjId ist ein ein-eindeutiger Schlüssel für das zu ändernde Objekt und sValue ist der neue Wert.

Dies ist das Prinzip, dass man einem Objekt mittels einer Nachricht über Veränderungen informiert. Alle Nachrichten laufen hierbei über immer die gleich Schnittstelle.

Vorteil: Wenn sich die GUI ändert so hat dies keinen Einfluss auf die anderen Klassen. Es müssen nur entsprechende Änderungen in der 'set'-Methode gemacht werden.

EDIT: Die Objekt-ID wird natürlich als Konstante in einem Interface abgelegt. 🙂
 
habe ich nicht richtig verstanden. wie meinst du es denn? myObject? könntest du es nochmal kurz erläutern?
 
Nicht schön, aber kurz zum Verständnis:

Code:
public class MyObject {
  private JLalel m_Label1;
  private JLabel m_Label2;
  
  ...

  public void set( int iObjId, String sValue ) {
    if ( iObjId == 1 ) { // eigentlich eine Konstante
      m_Label1.setText( sValue );
    } else if ( iObjId == 2 ) { // eigentlich eine Konstante
      m_Label2.setText( sValue );
    } else {
       ...
    }
  }

}
 
nein, wenn du einmal 20 labels hast und sonstige objekte kann musst du nicht 50 setter und getter methoden schreiben, auserdem musst du bei änderungen nur die settermethode ändern, und die konstanten und die 2 te klasse kannst du so lassen wie sie ist...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben