Eigene Java Klasse für allgemeine Grafikelemente

MJannek

Mitglied
Hallo Zusammen,
ich möchte mir eine eigene Klasse für allgemeine Grafikelemente in Java erstellen. Ich habe mir derzeit folgendes Interface erstellt.
Java:
public interface SwingUtilsX {
    void setColor(Component comp);
    void setColor(Color f, Color b);
    void invertColors();
    void setFont(Component comp);
    void clear();
    void centerText();
    void toUpper();
    void toLower();
    void toNormalText();
    void setStats(Font font, Color f, Color b) ;
    void setStats(Component comp);
    void setStats(Component comp, Font font);
    void setStats(Font font);
    void setStats(Component comp, Color f, Color b);
    void addToFrame(JFrame frame);
    void addToPanel(JPanel panel);
    void enabled();
    void notEnabled();
    void LEFT();
    void RIGHT();
    void CENTER();
    int getXW();
    int getYH();
    void setBounds(int x, int y, Component comp);
    void setBounds(int x, int y, int size);
    void setBounds(Bounds b);
    void setBounds(Component comp);
    void setBounds(int x);
    void setBounds(int x, int y);
}
Dieses rufe ich derzeit in jeder meiner gewünschten Klassen über implements auf und schreibe überall den identischen Code rein. Eigentlich möchte ich mir eine eigene Klasse dafür erstellen. ich weiß jedoch nicht, von welcher Klasse ich erben muss um die Standardmethoden setBounds, setBackground, setOpaque, etc außerdem nutzen zu können. Ich möchte den weiterführend meine eigenen Klassen FrameX, LabelX, ButttonX, PanelX, ComboBoxX<E> erstellen, die von dieser neuerstellten Klasse erben sollen.

LG Markus

k
 

Robert Zenz

Top Contributor
Ohje, da hast du was vor.

Es gibt in Java keine multiple Vererbung, also eine Klasse kann immer nur von einer Klasse erben. Also wenn du jetzt gerne das JLabel erweitern willst mit deiner Schnittstelle zu einem LabelX, dann kannst du nicht noch eine AbstractSwingX Klasse haben von dem die Sache erbt. Also musst du Code duplizieren. Da gibt es jetzt ein paar Moeglichkeiten. Entweder du hast du entsprechenden Funktionen in einer externen Klassen:

Java:
public class LabelX extends JLabel implements SwingX {
    @Override
    public void toNormalText() {
        setText(StaticSwingUtilityX.toNormalText(getText()));
    }
}

Oder in einer Klasse die eine beliebige Component uebernimmt und dann auf der arbeitet:

Java:
public class LabelX extends JLabel implements SwingX {
    protected SwingUtilityX swingUtilityX = new SwingUtilityX(this);

    @Override
    public void toNormalText() {
        swingUtilityX.toNormalText();
    }
}

Letzteres wird vermutlich das beste werden.
 

MJannek

Mitglied
Ohje, da hast du was vor.

Es gibt in Java keine multiple Vererbung, also eine Klasse kann immer nur von einer Klasse erben. Also wenn du jetzt gerne das JLabel erweitern willst mit deiner Schnittstelle zu einem LabelX, dann kannst du nicht noch eine AbstractSwingX Klasse haben von dem die Sache erbt. Also musst du Code duplizieren. Da gibt es jetzt ein paar Moeglichkeiten. Entweder du hast du entsprechenden Funktionen in einer externen Klassen:

Java:
public class LabelX extends JLabel implements SwingX {
    @Override
    public void toNormalText() {
        setText(StaticSwingUtilityX.toNormalText(getText()));
    }
}

Oder in einer Klasse die eine beliebige Component uebernimmt und dann auf der arbeitet:

Java:
public class LabelX extends JLabel implements SwingX {
    protected SwingUtilityX swingUtilityX = new SwingUtilityX(this);

    @Override
    public void toNormalText() {
        swingUtilityX.toNormalText();
    }
}

Letzteres wird vermutlich das beste werden.
Ich weiß, das es keine Mehrfachvererbung gibt.
Ich möchte es wie folgt darstellen
Java:
public class ComponentX extends KlasseNochUnkannt{
    public void myMethod1(){
        
    }
    public void myMethod2(){
        
    }
}

public class LabelX extends ComponentX{
    
}
public class ButtonX extends ComponentX{
    
}
usw
Aus KlasseNochUnkannt möchte ich mir die obigen Standardmethoden holen
 

Robert Zenz

Top Contributor
Dann mach' dir eine abstrakte Klasse:

Java:
public abstract class AbstractSwingX implements SwingX {
    @Override
    public void toNormalText() {
        // Logic goes here.
    }
}

public class LabelX extends AbstractSwingX {
}

Oder alternativ sowas:

Java:
public abstract class SwingX extends Component implements SwingX {
    // Abstract implementation.
}
 

mihe7

Top Contributor
Ich verstehe zwar den Sinn dahinter nicht, aber für meine Begriffe ist das einfach ein Adapter.

Skizze:

Ein allgemeines Element möglichst unabhängig vom Framework
Java:
interface Element {
    void setColor(Element elem); // hier ohne Component
    void setColor(Color f, Color b); // Color muss nicht zwangsweise dei AWT-Color sein, nehme ich aber einfach mal an
    // ...
}

Element, abhängig von AWT:
Java:
interface AWTElement extends Element {
    Component getComponent(); // jetzt mit AWT

    default void setColor(Element elem) {
        if (!(elem instanceof AWTElement)) return; // oder Exception
        Component comp = ((AWTElement) elem).getComponent();
        setColor(comp.getForeground(), comp.getBackground());        
    }

    default void setColor(Color f, Color b) { 
        getComponent().setForeground(f);
        getComponent().setBackground(b);   
    }
}

Eine Standardimplementierung.
Java:
public class DefaultAWTElement implements AWTElement {
    private final Component component;

    public DefaultAWTElement(Component component) { this.component = component; }

    public Component getComponent() { return component; }

    // ...
}
Es kann weitere Implementierungen geben, z. B. um Texte zu formatieren. Dann kann man sich eine Factory basteln, die je nach Komponente die richtige Implementierung wählt. In Verwendung könnte dann das etwa so aussehen:
Java:
AWTElementFactory factory = new AWTElementFactory();

Element label = factory.createElement(new JLabel("X"));
Element textField = factory.createElement(new JTextField(20));

label.setColor(Color.RED, Color.WHITE);
textField.setColor(label);
 

MJannek

Mitglied
Ich verstehe zwar den Sinn dahinter nicht, aber für meine Begriffe ist das einfach ein Adapter.

Skizze:

Ein allgemeines Element möglichst unabhängig vom Framework
Java:
interface Element {
    void setColor(Element elem); // hier ohne Component
    void setColor(Color f, Color b); // Color muss nicht zwangsweise dei AWT-Color sein, nehme ich aber einfach mal an
    // ...
}

Element, abhängig von AWT:
Java:
interface AWTElement extends Element {
    Component getComponent(); // jetzt mit AWT

    default void setColor(Element elem) {
        if (!(elem instanceof AWTElement)) return; // oder Exception
        Component comp = ((AWTElement) elem).getComponent();
        setColor(comp.getForeground(), comp.getBackground());       
    }

    default void setColor(Color f, Color b) {
        getComponent().setForeground(f);
        getComponent().setBackground(b);  
    }
}

Eine Standardimplementierung.
Java:
public class DefaultAWTElement implements AWTElement {
    private final Component component;

    public DefaultAWTElement(Component component) { this.component = component; }

    public Component getComponent() { return component; }

    // ...
}
Es kann weitere Implementierungen geben, z. B. um Texte zu formatieren. Dann kann man sich eine Factory basteln, die je nach Komponente die richtige Implementierung wählt. In Verwendung könnte dann das etwa so aussehen:
Java:
AWTElementFactory factory = new AWTElementFactory();

Element label = factory.createElement(new JLabel("X"));
Element textField = factory.createElement(new JTextField(20));

label.setColor(Color.RED, Color.WHITE);
textField.setColor(label);
Ich möchte in Java in meine erweiterten Klassen überall die gleichen Methoten hinzufügen (indentische Methodensignator und identischer Methodenrumpf. In eine, Interface kann ich jedoch nur die Methodenköpfe(Signaturen) definiern. Ich möchte mir die ganzen Methoden nur einmal definieren, in irgendeiner Klasse, von der ich dann erbe
 

KonradN

Super-Moderator
Mitarbeiter
Ich möchte in Java in meine erweiterten Klassen überall die gleichen Methoten hinzufügen (indentische Methodensignator und identischer Methodenrumpf. In eine, Interface kann ich jedoch nur die Methodenköpfe(Signaturen) definiern. Ich möchte mir die ganzen Methoden nur einmal definieren, in irgendeiner Klasse, von der ich dann erbe
Da ist dann die Frage, was genau diese Methoden machen / brauchen.

Denkbar sind z.B. in einem Interface default Methoden. Alles, worauf diese zugreifen, erfolgt dann z.B. über Getter, die ggf. abstrakt deklariert sind.

Aber generell solltest Du über #6 (Adapter) und #5 (FCoI: Favour Composition over Inheritance) nachdenken. Denn der rein objektorientierte Ansatz über Vererbung ist oft nicht das, was wirklich zielführend ist. Also selbst, wenn ich zuvor eine technische Möglichkeit genannt habe, ist das aus meiner Sicht nicht das, was ich machen würde.
 

mihe7

Top Contributor
Ich möchte in Java in meine erweiterten Klassen überall die gleichen Methoten hinzufügen (indentische Methodensignator und identischer Methodenrumpf. In eine, Interface kann ich jedoch nur die Methodenköpfe(Signaturen) definiern. Ich möchte mir die ganzen Methoden nur einmal definieren, in irgendeiner Klasse, von der ich dann erbe
Das macht der Code ja auch weitgehend - allerdings wirst Du nicht überall die gleiche Implementierung haben können, weil z. B. nicht jede Komponente eine Methode "setText" hat.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
P Eigene CMD GUI zum Starten von JAR AWT, Swing, JavaFX & SWT 10
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Border für Buttons AWT, Swing, JavaFX & SWT 19
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
C ISelectionProvider und eigene Selections AWT, Swing, JavaFX & SWT 2
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben