BooleanLabel

detrix

Mitglied
Hallo,

ich möchte gerne ein "BooleanLabel" realisieren. Das Label hat - logischerweise - die zwei Zustände "wahr" und "falsch". Bei einer Änderung des Zustands soll das Label dann auch anders dargestellt werden.

Etwa:

Java:
...

if (state) {
  setBackground(Color.RED);
} else {
  setBackground(Color.BLUE);
}

...

Ich habe zwar eine Vorstellung, wie ich das umsetzten würde, wollte aber eure Vorschläge hören.

Grüße detrix

P.S: Wie würdet ihr das z.B. machen bei drei oder mehr Zuständen (Enum)?
 
G

Gast2

Gast
Was für Vorschläge wollst du denn hören?
Du erbst evtl. von JLabel und hast zusätzlich ne Methode
Code:
setState(boolean newState);
.

Bei mehreren Zuständen: Entweder enums oder nen BitSet
 

eRaaaa

Top Contributor
???:L Komische Frage irgendwie ...
je nach Zustand halt setText true oder false setzen...so wie in deinem Beispiel halt


Zustandswechsel:
Java:
label.setText(""+!Boolean.parseBoolean(label.getText()));

:D:oops::autsch: (irgendwie konnte ich mich für keinen entscheiden, treffen alle zu)
 

detrix

Mitglied
Oh je, da habe ich etwas angezettelt. :lol:

Jau, das ist mir schon alles klar. Ich hätte die Frage wohl doch etwas präzisieren sollen. :D

Das Label soll im Zustand "falsch" z.B.:

- Hintergrund: gelb
- Text: "Aus"
- ...

Im Zustand "wahr" z.B.:

- Text: "Ein"
- ...

Da ich aber knapp 70 solcher Labels habe, die (zum Teil) immer Unterschiedlich dargestellt werden, muss die Darstellung für jedes Label individuell gesetzt werden.

Wie realisiere ich das am elegantesten? Mache ich das über ein Event (wenn sich "state" ändert), überschreibe ich einfach "setState(...)", ...?

Ich hoffe, nun ist es etwas klarer... :autsch:

Grüße detrix
 

Michael...

Top Contributor
Ich hoffe, nun ist es etwas klarer... :autsch:
Naja.

Du erbst einfach von JLabel und ergänzt es um Attribute und Methoden, damit die neue Klasse Deine Ansprüche erfüllt.
z.B. in der Art:
Java:
class BooleanLabel extends JLabel {
    private boolean state;
    private Color activeBGColor;
    private Color deactiveBGColor;
    private String activeText;
    private String deactiveText;
...
 

KrokoDiehl

Top Contributor
Zuerst einmal musst du bei jedem JLabel die Eigenschaft
Code:
setOpaque(true)
setzen, da man sonst keinen Hintergrund sieht.

Ansonsten kommt es darauf an, wie und wo der boolsche Wert geändert wird. Ist da eine CheckBox nebendran, passiert es irgendwo in der Programmlogik? Das bestimmt, wie aufwendig man das umsetzen kann...
Der generelle Weg sollte wohl schon über einen ChangeListener oder ItemStateListener gehen, den deine Labels implementieren und entsprechend reagieren. Nur woran sie sich als Listener hängen, liegt am o.g. Punkt.
 

detrix

Mitglied
@Michael...: Danke, aber ich habe zusätzliche Programmlogik, die ausgeführt werden muss. Daher müsste ich schon über einen Listener gehen.

@KrokoDiehl: Ja, das mit "setOpaque" ist mir klar. Das obere Beispiel war auch nur schnell hingeschrieben. Der Korrektheit, aber Danke.

Hauptsächlich in der Programmlogik.

Grüße detrix
 

Michael...

Top Contributor
@Michael...: Danke, aber ich habe zusätzliche Programmlogik, die ausgeführt werden muss. Daher müsste ich schon über einen Listener gehen.
Das Label soll als Listener registriert werden können? Dann kannst ja jederzeit beliebige Listener Interfaces implementieren.
Oder sollen andere Objekte auf Statusänderungen des Labels reagieren? Dann müssen sich diese als Listener am Label registrieren.
 
L

Lenni

Gast
Kleiner Tipp am Rande...

Java:
if (state) {
  setBackground(Color.RED);
} else {
  setBackground(Color.BLUE);
}

if-else-Bedingung mit dieser Struktur können einfacher dargestellt werden. Dazu wird der ?-Operator verwendet.

In deinem Beispiel würde das so aussehen:

Java:
setBackground(state?Color.RED:Color.BLUE);

Dies ist vorallem zu entfehlen, wenn du mehrere dieser Blöcke hättest und der Code sonst aufgebläht wird.
 

detrix

Mitglied
Wie setzte ich denn einen "ChangeListener" oder "ItemStateListener" für meinen Anwendungszweck ein? Bzw. welchen setzen ich ein, wenn sich der Zustand in der Programmlogik ändert?

Grüße detrix
 

KrokoDiehl

Top Contributor
Also der allereinfachste Fall mit einem ItemListener würde in etwa so aussehen:
Java:
public class MyLabel extends JLabel implements ItemListener
{
    // ....

    @Overwrite
    public void itemStateChange(ItemEvent event)
    {
        if (event.getStateChange() == ItemEvent.SELECTED)
            this.setBackground( mySelectedBackgroundColor );
        else
            this.setBackground( myDeSelectedBackgroundColor );
    }
}

Und den muss man nun woran hängen:
Java:
// Bsp CheckBox
MyLabel label = new MyLabel();
JCheckBox cBox = new JCheckBox();
cBox.addItemListener(label);

Wenn du eine eigene Verwaltung von Zuständen hast, musst du dort die Möglichkeit bieten, dass sich ItemListener dranhängen und bei einer Zustandsänderung diese Listener informieren. In der Java API zur EventListenerList ist ein nettes Beispiel.

Der ItemListener ist hier übrigens nur ein Beispiel. Du kannst auch einen eigenen machen oder einen ChangeListener nehmen, je nachdem was sinngemäß besser ist.
 

Neue Themen


Oben