JLabel kopieren

du machst eine Copy methode du übergibst eine Label
erstellst ein Label und übergibst dem Die werte die im anderen drin sind
somit hast du 2 Labels die Unabhängig sind
 
"wenn ich das eine ändere, wird nicht das andere geändert"
So geht das nicht. Sofern beide Labels direkt in ein Formular eingebunden sind, sind beides einzigartige Objekte.
Beste Lösung: Sprich sie nicht direkt an, sondern über einen Wrapper, der die benötigten änderbaren Eigenschaften bereitstellt. Der ändert dann beide Labels.

Du kannst aber auch so arbeiten:

Java:
class MasterLabel extends JLabel {
    private JLabel childLabel
    public MasterLabel (JLabel childLabel) {
        this.childLabel = childLabel;
    }
    @Override
    public void setText(String s) {
        super.setText(s);
        if (childLabel != null) {
            childLabel.setText(s);
        }
    }
    ...
}

Ein weiterer Kunstgriff wäre - falls du mit Listen oder Tabellen usw. arbeitest - das Label als Komponente eines CellRenderers zu liefern. Auf diese Weise könnte das selbe Label an verschiedenen Stellen angezeigt werden.


Zu deinem ursprünglichen Ansatz: Was hast du von einer Kopie denn erwartet? Kopier mal eine Seite eines Buches, dann schreib (mit Bleistift bitte) etwas auf die Originalseite. Wird die Kopie geändert?
 
"wenn ich das eine ändere, wird nicht das andere geändert"
So geht das nicht. Sofern beide Labels direkt in ein Formular eingebunden sind, sind beides einzigartige Objekte.
Beste Lösung: Sprich sie nicht direkt an, sondern über einen Wrapper, der die benötigten änderbaren Eigenschaften bereitstellt. Der ändert dann beide Labels.

Du kannst aber auch so arbeiten:

Java:
class MasterLabel extends JLabel {
    private JLabel childLabel
    public MasterLabel (JLabel childLabel) {
        this.childLabel = childLabel;
    }
    @Override
    public void setText(String s) {
        super.setText(s);
        if (childLabel != null) {
            childLabel.setText(s);
        }
    }
    ...
}

Ein weiterer Kunstgriff wäre - falls du mit Listen oder Tabellen usw. arbeitest - das Label als Komponente eines CellRenderers zu liefern. Auf diese Weise könnte das selbe Label an verschiedenen Stellen angezeigt werden.


Zu deinem ursprünglichen Ansatz: Was hast du von einer Kopie denn erwartet? Kopier mal eine Seite eines Buches, dann schreib (mit Bleistift bitte) etwas auf die Originalseite. Wird die Kopie geändert?
Kopiert man ein JLabel und ändert das Original, wird di9e kopie auch geändert, da die JLabels verknüpft sind
 
Kopiert man ein JLabel und ändert das Original, wird di9e kopie auch geändert, da die JLabels verknüpft sind
Dass das nicht der Fall ist, ist mittlerweile klar 🙂

Java:
JLabel a = new JLabel("Hallo");
JLabel b = a; //das ist keine Kopie, b verweist auf das selbe Label wie a.
JLabel c = (JLabel)a.clone(); //sollte klappen, um eine Kopie zu erzeugen. Ansonsten ein neues anlegen und die Eigenschaften manuell kopieren, so wie weiter oben gesagt.
a.setText("Dada"); //ändert das von a und b referenzierte Label, aber nicht das von c referenzierte.
c.setText"Dudu"); //ändert nur das von c referenzierte Label.
 
Zuletzt bearbeitet:
Hast du schon .clone() ausprobiert?
Die Methode Object.clone() ist protected und JLabel implementiert, meines Wissens, Cloneable nicht. Außerdem: clone() ist doof! 😉 Joshua Bloch beschreibt es mehr oder weniger als "Fehltritt" und "nicht zur Nachahmung empfohlen".

Es stellt sich halt die Frage, warum man ein Label kopieren möchte, um dann etwas daran zu ändern?

Die Haupteigenschaft des Labels ist der Text. Ein Label soll in den meisten Fällen einen Text anzeigen. Warum sollte man also ein Label mit einem bestimmten Text kopieren, um anschließend den Text dann zu ändern. Man könnte ja gleich ein neues Label mit anderem Text erstellen. Das sind aber nur Vermutungen und Gedanken dazu. Deshalb auch die Frage nach dem "Warum".
 
Zuletzt bearbeitet:
Die Methode Object.clone() ist protected und JLabel implementiert, meines Wissens, Cloneable nicht. Außerdem: clone() ist doof! 😉 Joshua Bloch beschreibt es mehr oder weniger als "Fehltritt" und "nicht zur Nachahmung empfohlen".

Es stellt sich halt die Frage, warum man ein Label kopieren möchte, um dann etwas daran zu ändern?

Die Haupteigenschaft des Labels ist der Text. Ein Label soll in den meisten Fällen einen Text anzeigen. Warum sollte man also ein Label mit einem bestimmten Text kopieren, um anschließend den Text dann zu ändern. Man könnte ja gleich ein neues Label mit anderem Text erstellen. Das sind aber nur Vermutungen und Gedanken dazu. Deshalb auch die Frage nach dem "Warum".

Ok, dann ohne clone () 🙂
Ich hab's auch noch nie gemacht, hab nie einen Sinn darin gesehen. Das wäre eben nur mein erster Ansatz für eine Kopie.

Die nächste Frage hab ich mir selbst schon gestellt. Ok, er will änderbaren Text an 2 Positionen, der sich zugleich ändern soll, das ist absolut ok. Ein Label mag ja z.B. die Beschreibung einer Auswahl darstellen oder einen Status wiedergeben (klassisches Beispiel: Statuszeile). Wenn er hier eine "2D Engine" Baut, dann mag ein Status auch 2 mal gebraucht werden, wer weiß.
Für jede Textänderung das Label aus dem Formular zu löschen, ein neues zu erstellen und das dann einzufügen ... nein, da greif ich doch lieber auf die Methode setText(String) zu.

Ich würde Labels aber so oder so nicht für eine "Engine" wählen, wo die Performance wichtiger ist als in einem Formular, paintText() oder ähnliche Methoden aufrufen, um den gewünschten Text anzuzeigen.
 
Nein, ich benutze das JLabel, um mehrere Components zu verbinden
Ich wiederhole mich: warum (bzgl. Kommentar #5: nicht wofür)? Was ist die Überlegung dahinter, ein JLabel kopieren zu wollen? Was willst Du "verbinden" und was soll das heißen?

Die Frage stellt sich, weil das "Kopieren" eines JLabels mit an Sicherheit grenzender Wahrscheinlichkeit der falsche Weg ist.
 
Das KANN man schon machen, rein technisch gesehen ist ein Label ein Container. Aber es ist absolut NICHT sinnvoll. Dafür verwendet man im Normalfall Panels.

Falls du das so machen willst und die Texte der untergeordneten Labels sich mit ändern sollen, dann musst du das so machen wie in meiner ersten Antwort. Du musst die Subkomponenten durchgehen, prüfen, ob es sich um Labels handelt und dann deren Text ändern.

ps: Du solltest mit dem, der dir das beigebracht hat, mal ein erstes Wörtchen reden.
 
wenn du sehr auf verbindungen zwischen nodes aufbauen willst dann nimm javafx her, das hat properties die darauf ausgelegt sind und vllt besser passen

zusätzlich FXGL ist eine Game Engine die auf javafx drauf gebaut wurde solltest du dir vllt ansehen
 
wenn du sehr auf verbindungen zwischen nodes aufbauen willst dann nimm javafx her, das hat properties die darauf ausgelegt sind und vllt besser passen

zusätzlich FXGL ist eine Game Engine die auf javafx drauf gebaut wurde solltest du dir vllt ansehen
Er sollte sich zunächst von GUIs und Game Engines komplett fern halten und erst mal die Grundlagen lernen.

Mir ist klar, dass Anfänger gerne was auf dem Bildschirm sehen möchten, aber dennoch sind die Grundlagen Vorbedingung, um das auch sinnvoll umsetzen zu können. Darum programmiere gerne ein einfaches Spiel, aber mach das am Anfang erst mal nur auf der Konsole. Alles andere (einschließlich vieler unsäglicher YT-Tutorials) ist nicht zielführend.
 
dann kann er auch einfach unity hernehmen das ist fast idioten sicher dass man da was auf den bildschirm kriegt

oder fxgl wenns unbedingt java sein muss
 
Er sollte sich zunächst von GUIs und Game Engines komplett fern halten und erst mal die Grundlagen lernen.

Mir ist klar, dass Anfänger gerne was auf dem Bildschirm sehen möchten, aber dennoch sind die Grundlagen Vorbedingung, um das auch sinnvoll umsetzen zu können. Darum programmiere gerne ein einfaches Spiel, aber mach das am Anfang erst mal nur auf der Konsole. Alles andere (einschließlich vieler unsäglicher YT-Tutorials) ist nicht zielführend.
Habe ich schon vor langer Zeit gemacht.
 
Ich habe schon viel mit Console gemacht, aber noch nicht so viel mit JLabels.
Ich glaube wenn, dann sollte ich mit den Components beschäftigen, was ich ja gerade mache und auch deswegen gefragt habe
 

Zurück
Oben