Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel?

P@u1

Aktives Mitglied
Hallo zusammen,

ich habe vor kurzem angefangen, meine erste eine Swing-Komponente zu entwickeln, ich habe sie JPlot genannt.
Ich habe bisher alles auf Basis eines JPanels gemacht, von dem der JPlot erbt. Auf diesen Panel werden dann Linien gezeichnet und ein JLabel wird auf den Panel geadded um Text anzuzeigen.

Nach außen hin will ich aber eigentlich, dass die Komponente die Schnittstelle einer JComponent hat (bei JPanel kann man sonst einiges damit machen, was ich eigentlich nicht möchte, dass das von außen gemacht werden kann, wie z.B. den LayoutManager ändern oder Komponenten in den Container adden oder wegmachen).
Allerdings brauche ich zur Umsetzung die Methoden von JPanel, so kann ich z.B. den JPanel einfach mit add hinzufügen, was bei JComponent soweit ich weiß nicht so einfach geht und ich weiß auch nicht genau wies mitm Zeichnen ist bei JComponent.
Wie kann ich das Problem lösen? Kann ich die Funktionalitäten von JPanel irgendwie benutzen, ohne davon zu erben, oder so?
 

Marco13

Top Contributor
Es ist fast egal: Tatsächlich erweitert JPanel die JComponent nur um ganz wenige Methoden, die ohnehin sehr spezifisch sind und nicht von clients aufgerufen werden sollten. (Fields kommen übrigens gar keine dazu). Das, was dich am meisten stört, hat nämlich schon JComponent: JComponent erbt schon von Container (!), und deswegen hat schon JComponent so Methoden wie setLayout und add(Component), die man bei einer "reinen" selbstgebauten Component eigentlich nicht so gerne hätte...


Ich finde es auch manchmal schade, dass es in Java keine private Vererbung (wie in C++) gibt - dass man also nicht schreiben kann
Code:
class MyClass [b]privately[/b] extends ArrayList<Thing> { ... }
so dass man das, wovon man erbt, nicht mehr in der Schnittstelle sieht. Aber so ist es eben.
 

P@u1

Aktives Mitglied
Hm dann wirds wohl nicht anders gehen...

Ich hatte nur mal versucht nen JLabel auf ne JComponent zu adden und ich meine da wurde nichts sichtbar, aber vll habe ich einfach irgendwas falsch gemacht.

Edit:

Und das heißt, ich könnte bei nem JButton auch einfach sachen einfügen?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Jupp. Was er damit macht, ist eine andere Frage. Man müßte denen ja auch einen LayoutManager verpassen, andere ("Zusammengesetzte") Components wie JList haben schon einen LayoutManager, und zwar einen ganz speziellen. Theoretisch steht es den Components auch frei, die Components, die ihnen hinzugefügt werden, zu ignorieren. (Man könnte auch alle möglichen "unerwünschten" Methoden so überschreiben, dass sie eine UnsupportedOperationException werfen ;) ) ... aber das sollte man wohl NICHT machen: Je mehr man Swing auf diese Weise ins Handwerk pfuscht, umso wahrscheinlicher ist, dass irgendwann irgendwas nicht mehr funktioniert....
 

CroniD

Aktives Mitglied
Hm dann wirds wohl nicht anders gehen...

Ich hatte nur mal versucht nen JLabel auf ne JComponent zu adden und ich meine da wurde nichts sichtbar, aber vll habe ich einfach irgendwas falsch gemacht.

Edit:

Und das heißt, ich könnte bei nem JButton auch einfach sachen einfügen?

Zu deinem Edit: Ja.

Das ein JLabel in einer JComponent nicht angezeigt wird, liegt daran, dass kein layoutManager gesetzt wird. Es wird also das "null"-Layout benutzt. D.h. man muss selbst Koordinaten des JLabels angeben oder einen Layoutmanager definieren.
Java:
JComponent comp = new JComponent() {
// JComponent is an abstract class, but without abstract methods
};
comp.add(new JLabel("Hallo"));
comp.setLayout(new FlowLayout());
comp.setBounds(20, 220, comp.getPreferredSize().width, comp.getPreferredSize().height);
myPanel.add(comp);

Weiterhin, wenn du willst, dass deine Komponente nicht als Container fungiert, dann entweder alle relevanten Methoden überschreiben oder, ein etwas anderer Weg ist es einfach die protected "paintChildren(Graphics)" Methode zu überschreiben, denn diese Methode ist für das Zeichnen der Kinder zuständig. ;)
Java:
JComponent comp = new JComponent() {
        @Override protected void paintChildren(Graphics g) {
        	// do nothing
        }
};
 

Marco13

Top Contributor
Weiterhin, wenn du willst, dass deine Komponente nicht als Container fungiert, dann entweder alle relevanten Methoden überschreiben oder, ein etwas anderer Weg ist es einfach die protected "paintChildren(Graphics)" Methode zu überschreiben, denn diese Methode ist für das Zeichnen der Kinder zuständig. ;)

Das hatte ich ja auch angedeutet, aber nicht weiter ausgeführt: Solche Sachen können eben ... unerwünschte Effekte haben. Nur als EIN Beispiel (ein sehr offensichtliches - es gibt sicher noch viel diffizilere und überraschende) : Die children sind dann ja immernoch DA, auch wenn sie nicht angezeigt werden. Es kann dann z.B. sein, dass MouseEvents nicht mehr bei der Component ankommen, weil sie vorher von einer Child-Component verschluckt werden. Solche "Fehler" sind dann ... kaum in der Praxis aufzuspüren...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
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
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
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
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
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
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
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
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
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
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
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
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35

Ähnliche Java Themen

Neue Themen


Oben