Komponenten um weitere Hintergrund- bzw. Vordergrundfarbe erweitern

detrix

Mitglied
Hallo liebe Java-Gemeinde,

für ein Projekt muss ich einige Swing-Komponenten so erweitern, dass eine zweite Hintergrund- bzw. Vordergrundfarbe zur Verfügung steht.

Die Klassenstruktur sieht folgendermaßen aus:

TLabel erbt von JLabel,
TPanel erbt von JPanel,
TClock erbt von JComponent
...

Die Komponenten (TLabel, TPanel, TClock, ...) implementieren die Schnittstelle "IInversible". Die Funktionalität sieht wie folgt aus:

Java:
    ...
    public void setSuperBackground(Color bg) {
        super.setBackground(bg);
    }

    public void setSuperForeground(Color fg) {
        super.setForeground(fg);
    }

    @Override
    public void setBackground(Color bg) {
        defaultBackground = bg; // Zwischenspeichern der Hintergrundfarbe
        setSuperBackground(bg);
    }

    @Override
    public void setForeground(Color fg) {
        defaultForeground = fg; // Zwischenspeichern der Vordergrundfarbe
        setSuperForeground(fg);
    }

    public boolean isInverse() {
        return inverse;
    }

    public void setInverse(boolean inverse) {
        if (inversible) {
            if (inverse) {
                setSuperBackground(getInverseBackground());
                setSuperForeground(getInverseForeground());
            } else {
                setSuperBackground(defaultBackground);
                setSuperForeground(defaultForeground);
            }
        }
        this.inverse = inverse;
    }
    
    public Color getInverseBackground() {
        return inverseBackground;
    }

    public void setInverseBackground(Color inverseBackground) {
        this.inverseBackground = inverseBackground;
    }

    public Color getInverseForeground() {
        return inverseForeground;
    }

    public void setInverseForeground(Color inverseForeground) {
        this.inverseForeground = inverseForeground;
    }

    public boolean isInversible() {
        return inversible;
    }

    public void setInversible(boolean inversible) {
        this.inversible = inversible;
    }
    ...

Das funktioniert soweit auch recht gut, allerdings muss ich die Logik immer wieder neu kopieren... An dieser Stelle wäre Mehrfachvererbung wohl ganz praktisch. Wie löse ich das Problem? Vielleicht muss bzw. kann ich die Logik auch anderswo in Swing platzieren? Ideen?

Grüße detrix
 
Zuletzt bearbeitet:

slawaweis

Bekanntes Mitglied
Das funktioniert soweit auch recht gut, allerdings muss ich die Logik immer wieder neu kopieren... An dieser Stelle wäre Mehrfachvererbung wohl ganz praktisch.
nicht unbedingt, Du müsstest immer noch von jeder benötigten Klasse ableiten.

Wie löse ich das Problem? Vielleicht muss bzw. kann ich die Logik auch anderswo in Swing platzieren? Ideen?
über Komposition und get/putClientProperty. Dazu erstellst Du dir eine einzige Klasse die IInversible implementiert, nach diesem Muster:

Java:
public class InversibleImpl implements IInversible
{
 public InversibleImpl(JComponent component, Color param1/*, ...*/)
  {
  /*...*/
  }
 /*...*/
}

Dazu schreibst Du eine Utility-Klasse InversibleUtils mit folgender statischer Funktion:

Java:
public class InversibleUtils
{
 public static IInversible get(JComponent component)
  {
  IInversible invs = component.getClientProperty("provider-inversible-extension");
  if(invs == null)
    {
    invs = new InversibleImpl(component, Color.RED/*, ...*/);
    component.putClientProperty("provider-inversible-extension", invs);
    }
  return invs;
  }
}

und so wird es dann aufgerufen:

Java:
 JLabel label = new JLabel("Text");

 /* ... */

 IInversible invs_label = InversibleUtils.get(label);

mit addPropertyChangeListener kannst Du in InversibleImpl darauf lauschen, ob anderswo die Hintergrund- bzw. Vordergrundfarbe verändert wurde. So kann man sogar schon bestehende Programme ganz einfach erweitern.

Slawa
 
Zuletzt bearbeitet:

detrix

Mitglied
Hm, ich muss immer zwischen der "normalen" und der "inversen" Farbe wechseln können. Es kann auch sein, dass sich die "normale" Farbe zur Laufzeit verändert. Mit "component.setBackground(bg);" würde ich ja die "normale" Hintergrundfarbe immer überschreiben…

Außerdem muss jedes TLabel, TPanel, etc. diese Funktionalität beinhalten. Sprich: Für jeden Komponente mit "InversibleUtils" arbeiten, finde ich ziemlich umständlich… Wobei ich das ja direkt in die Komponenten setzten könnte...

Auf Knopfdruck müssen alle Komponenten in die inverse bzw. normale Farben "switchen". Bisher so gelöst, dass die Komponenten geparst werden:

Java:
    ...
    private void inverse(JComponent component, boolean inverse) {
        if (component instanceof IInversible) {
            IInversible c = (IInversible)component;
            c.setInverse(inverse);
        }
        for (Component child : component.getComponents()) {
            try {
                inverse((JComponent)child, inverse);
            } catch (Exception ex) {}
        }
    }
    ...
 

slawaweis

Bekanntes Mitglied
Hm, ich muss immer zwischen der "normalen" und der "inversen" Farbe wechseln können. Es kann auch sein, dass sich die "normale" Farbe zur Laufzeit verändert. Mit "component.setBackground(bg);" würde ich ja die "normale" Hintergrundfarbe immer überschreiben…
die "normale" Hintergrundfarbe musst Du natürlich zwischenspeichern, wie Du es ja auch in deinem ersten Beispiel gemacht hast. Was das Ändern der Farbe zu Laufzeit angeht, da habe ich bereits auf addPropertyChangeListener verwiesen:

Container (Java Platform SE 6)

Außerdem muss jedes TLabel, TPanel, etc. diese Funktionalität beinhalten. Sprich: Für jeden Komponente mit "InversibleUtils" arbeiten, finde ich ziemlich umständlich… Wobei ich das ja direkt in die Komponenten setzten könnte...
wenn es für Dich einfacher ist von jeder benötigten Komponente eine eigene Klasse mit eigener Funktionalität abzuleiten, dann arbeite so. Ich weis ja am Ende nicht, was Du alles geplant hast. Ich wollte nur eine Idee geben, wie man die Logik anderswo in Swing platzieren kann.

Auf Knopfdruck müssen alle Komponenten in die inverse bzw. normale Farben "switchen". Bisher so gelöst, dass die Komponenten geparst werden:
dann musst Du InversibleUtils so abändern, dass die IInversible nur in den benötigten Komponenten installiert wird, mit einer Funktion "install(JComponent component)" oder der Erweiterung "get(JComponent component, boolean install)".

Slawa
 

detrix

Mitglied
Danke für Deine bisherige Mühe und ich bin für jeden Vorschlag dankbar, das sollte nicht falsch rüberkommen.

Ich benötige mein TLabel, das von JLabel erbt, weil es noch etwas mehr Logik beinhaltet.

Die Hinter- bzw. Vordergrundfarbe speichere ich zwischen, in dem ich die "setBackground()" bzw. "setForeground()" überschreibe (s. oben).

Wenn ich nun mit "component.setBackground(bg)" arbeite, endet das in einem Ping-Pong Spiel zwischen TLabel und TLabel. Mit "super.setBackground(bg)" würde das TLabel die Farbe an JLabel weitergeben... Gibt es da einen Ausweg, ohne jetzt z.B. eine Eigenschaft "normalBackground" bzw. "normalForeground" einzuführen.
 

slawaweis

Bekanntes Mitglied
Danke für Deine bisherige Mühe und ich bin für jeden Vorschlag dankbar, das sollte nicht falsch rüberkommen.

Ich benötige mein TLabel, das von JLabel erbt, weil es noch etwas mehr Logik beinhaltet.
das wusste ich nicht. Ich dachte bei den T* Klassen ging es nur darum, dass diese um IInversible erweitert werden.

Die Hinter- bzw. Vordergrundfarbe speichere ich zwischen, in dem ich die "setBackground()" bzw. "setForeground()" überschreibe (s. oben).

Wenn ich nun mit "component.setBackground(bg)" arbeite, endet das in einem Ping-Pong Spiel zwischen TLabel und TLabel. Mit "super.setBackground(bg)" würde das TLabel die Farbe an JLabel weitergeben... Gibt es da einen Ausweg, ohne jetzt z.B. eine Eigenschaft "normalBackground" bzw. "normalForeground" einzuführen.
der Sinn ist natürlich, dass wenn man eine Klasse InversibleImpl hat, man IInversible nicht mehr in den T* Klassen implementiert. Weiterhin muss es nicht in einem Ping-Pong Spiel enden, wenn man ein Flag verwendet, ob man selber die Eigenschaften ändert oder es irgendwo von außen passiert. Weiterhin verstehe ich das mit "normalBackground" nicht ganz, Du hast doch schon zwei Variablen "defaultBackground" und "inverseBackground". Ist "normalBackground" != "defaultBackground"?

Aber wenn Du schon sowieso ableitest, gäbe es noch eine Variante, über ein zusätzliches Service-Interface:

Java:
public interface IInversibleService
{
 public IInversible getInversible();
}

das kann man dann so verwenden:

Java:
 TLabel label = ...;

 label.getInversible().setInverseBackground(Color.RED);

dann kann man mit Delegation arbeiten und nur setBackground/setForeground jeweils überschreiben.

Slawa
 

detrix

Mitglied
Wird dann in der Methode "getInversible()" eine Instanz von "InversibleImpl" erzeugt bzw. zurück gegeben, die wiederum einen Verweis auf den Komponent hat? Sprich: new InversibleImp(this);

Wo ist dann die setBackground() bzw. setForeground() Methode, um die normale Farbe zwischenzuspeichern? Beziehungsweiße, wie würde das Zwischenspeichern konkret aussehen?

Ich stehe da gerade irgendwie auf dem Schlauch. :(

Kann ich dann weiterhin mit NetBeans im Eigenschaftsfenster den Inversen-Hintergrund setzten, mit dem Weg über das Service-Interface?

Danke Dir!
 

slawaweis

Bekanntes Mitglied
Wird dann in der Methode "getInversible()" eine Instanz von "InversibleImpl" erzeugt bzw. zurück gegeben, die wiederum einen Verweis auf den Komponent hat? Sprich: new InversibleImp(this);
ja, das ist der Sinn wegen, Zitat: "allerdings muss ich die Logik immer wieder neu kopieren".

Wo ist dann die setBackground() bzw. setForeground() Methode, um die normale Farbe zwischenzuspeichern? Beziehungsweiße, wie würde das Zwischenspeichern konkret aussehen?
die sind in den T* Klassen:

Java:
    @Override
    public void setBackground(Color bg) {
        inversible_impl.setDefaultBackground(bg); // Zwischenspeichern der Hintergrundfarbe
        super.setBackground(bg);
    }
    ...

Kann ich dann weiterhin mit NetBeans im Eigenschaftsfenster den Inversen-Hintergrund setzten, mit dem Weg über das Service-Interface?
nein

Slawa
 

detrix

Mitglied
Okay, danke. Und wie greife ich bei "setInverse()" auf "super.setBackground(inverseBackground)" zu? :D Befindet sich ja in "InversibleImpl"...
 

slawaweis

Bekanntes Mitglied
Okay, danke. Und wie greife ich bei "setInverse()" auf "super.setBackground(inverseBackground)" zu? :D Befindet sich ja in "InversibleImpl"...

Java:
public class TLabel ...
{
    public TLabel(...) {
        inversible_impl = new InversibleImpl(this);
    }

    @Override
    public void setBackground(Color bg) {
        inversible_impl.setDefaultBackground(bg); // Zwischenspeichern der Hintergrundfarbe
        super.setBackground(bg);
    }
}

Java:
public class InversibleImpl ...
{
    Color defaultBackground = ...;
    Component component = null;
    boolean ignore_set = false;

    public InversibleImpl(Component comp) {
        this.component = comp;
    }

    @Override
    public void setDefaultBackground(Color bg) {
        if(!ignore_set)
          defaultBackground = bg;
    }

    public void setInverse(boolean inverse) {
        ignore_set = true;
            if (inverse) {
                component.setBackground(getInverseBackground());
                component.setForeground(getInverseForeground());
            } else {
                component.setBackground(defaultBackground);
                component.setForeground(defaultForeground);
            }
        ignore_set = false;
        this.inverse = inverse;
    }

}

Slawa
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
F Gebundene Eigenschaften bei Komponenten mit NetBeans verarbeiten AWT, Swing, JavaFX & SWT 3
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
P Gleichmäßige Anodnung von Komponenten im migLayout AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Welche Komponenten vermisst ihr? Welche wären essenziell notwendig? AWT, Swing, JavaFX & SWT 8
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
J MouseOver bei Komponenten AWT, Swing, JavaFX & SWT 9
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
S BoxLayout: Anordnung der Komponenten links statt zentriert AWT, Swing, JavaFX & SWT 0
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
M Komponenten übereinander AWT, Swing, JavaFX & SWT 7
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
H Swing Getter für GUI-Komponenten AWT, Swing, JavaFX & SWT 3
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
N Komponenten übereinander AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
M Swing Komponenten enablen? AWT, Swing, JavaFX & SWT 4
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
A AWT Komponenten in JavaFX einbetten AWT, Swing, JavaFX & SWT 9
M Swing Komponenten erscheinen beim darüberfahren? AWT, Swing, JavaFX & SWT 7
H Komponenten unmittelbar nach dem Ausführen teilweise unsichtbar AWT, Swing, JavaFX & SWT 3
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
T Unter JPanel liegende Komponenten "totschalten" AWT, Swing, JavaFX & SWT 5
morphesus Swing Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 8
C Swing Reihenfolge der Initialisierung von Komponenten AWT, Swing, JavaFX & SWT 6
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 7
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 2
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Komponenten organisieren AWT, Swing, JavaFX & SWT 9
S Überlappung zweier Komponenten AWT, Swing, JavaFX & SWT 12
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
C GUI-Komponenten skalieren AWT, Swing, JavaFX & SWT 10
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Komponenten verstecken AWT, Swing, JavaFX & SWT 4
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
S Problem mit Swing Komponenten AWT, Swing, JavaFX & SWT 11
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
M Komponenten übereinander prüfen AWT, Swing, JavaFX & SWT 3
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
M Komponenten in anderer Reihenfolge anzeigen AWT, Swing, JavaFX & SWT 4
G swing Komponenten verrutschen ständig... AWT, Swing, JavaFX & SWT 6
D Mit GridBayLayout Komponenten anordnen AWT, Swing, JavaFX & SWT 6
N Window transparent, Komponenten nicht transparent AWT, Swing, JavaFX & SWT 11
R Farbänderung von Komponenten wird nicht wirksam AWT, Swing, JavaFX & SWT 7
P Swing Hierachie oder Reihenfolge von Komponenten AWT, Swing, JavaFX & SWT 5
T Sich überlappende Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Probleme beim Anzeigen der einzelnen Komponenten AWT, Swing, JavaFX & SWT 16
R Swing Komponenten klein angezeigt AWT, Swing, JavaFX & SWT 10
D Swing Swing Komponenten verschieben AWT, Swing, JavaFX & SWT 7
B Komponenten nach Skalierung nicht mehr ansprechbar AWT, Swing, JavaFX & SWT 9
Kr0e AWT Komponenten in JPanel AWT, Swing, JavaFX & SWT 6
JuliaOne Komponenten innerhalb eine JScrollpane werden auch ausserhalb davon gezeichnet! AWT, Swing, JavaFX & SWT 7
xehpuk Swing Komponenten werden durch setFont() winzig AWT, Swing, JavaFX & SWT 3
O Größe von Komponenten im JFrame manuell verändern AWT, Swing, JavaFX & SWT 2
H Komponenten anwendugsweit formatieren AWT, Swing, JavaFX & SWT 6
M Swing Komponenten mit fester Größe an Fensterrand(JFrame) AWT, Swing, JavaFX & SWT 2
A Komponenten zur Laufzeit entfernen AWT, Swing, JavaFX & SWT 3
Weiti Swing Animationen - Drehung aller Komponenten auf Knopfdruck AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben