Design Frage:
-
swing unterstützt ja JRadioButtons in Buttongroups welche sicher stellen das immer nur ein Button aktiviert ist.
Jetzt frage ich mich wie die Buttongroup "mitbekommt" das ein Button gedrückt wurde, ich möchte nämlich so etwas ähnliches implementieren.
ButtonGroup group = new ButtonGroup();
group.add(birdButton);
group.add(catButton);Schaut der Button selber nach ob er in einer group ist und deselektiert dann die anderen Buttons, oder snoopt die ButtonGroup irgendwie auf ein event?
Vielleicht etwas abstrakter: Ich habe ein Object welches sich ein einer Buttongroup befindet. wie komme ich nur mit einem "Pointer" auf dieses Objekt an die Buttongroup heran in der sich das Object befindet?
-
Ich muss sagen das buttongroups noch nie so mein favourite waren
deswegen kenn ich mich da auch nicht so aus
ich habe einmal kurz in der java 2 api nachgesehen
jbutton leitet von jcomponent ab
welches als evant handler designed wurdeich schätze die button group wird nicht mehr machen als sich mit eigenen listener zu den event listenern der buttons hinzuzufügen
dementsprechend weiss ein button nicht in welcher group er ist.
er kann auch in mehreren seinwenn du willst kannst du die listener objekte durchgehen und sehen ob du die button group findest
aber es besteht keine fixe abhängigkeitgomberl
-
ok Danke! So habe ich es mittlerweile auch gemacht..
-
Hi
ins Swing ist es zumindestens so, das sich button und buttongroup gegenseitig kennen.
Irgendwo hab ich auch mal ne methode gesehen, mit der man einem Button eine Buttongroup zuordnen kann. ( ging über eine zwischenklasse)mittels buttongroup.add(button) wird der button der Butongroup zugeordnet. weiter trägt sich die Buttongroup im Button ein. ( ähnlich dem Observer Pattern) wird nun der Button verändert, kann der Button die Buttongroup benachrichtigt, die dann entscheidet was mit den restlichen buttons passieren soll.
swing implementiert das etwas gemeiner. über AbstractButton.getModel().getGroup() kommt man an das groupen objekt heran.
und über ButtonGroup.getElements kommt man wieder an die angemeldeten ButtonElemente. und wenn ich das richtig gesehen hab, kann ein radio button nur einer groupe zugehören, habs noch nicht ausprobiert, sollte aber nach dem was ich gesehen hab nicht gehen.die Betroffenen Klassen
javax.swing.AbstractButton
javax.swing.ButtonModel
javax.swing.DefaultButtonModel
javax.swing.ButtonGroupgruss Termite
-
vielen Dank Termite:
Vielleicht noch eine Frage dazu: angenommen ich möchte den button herausbekommen der gerade selected ist.
Dazu kann ich natürlich alle buttons durchgehen und solange suchen bis ich einen finde der selected ist.
schöner wäre es direkt drauf zuZugreifen. Buttongroup.getSelection gibt das Model des selektierten buttons zurück.
1. Wie komme ich von dem ButtonModell auf den Button selber.
2. Eine Referenz auf das ButtonModel macht für mich irgendwie keinen Sinn. Buttonmodel ist ja nur ein Interface. Warum gibt es davon überhaupt eine Instanz? Sind Interfaces nicht quasi abstract?
-
eine Referenz auf das ButtonModel macht für mich irgendwie keinen Sinn. Buttonmodel ist ja nur ein Interface. Warum gibt es davon überhaupt eine Instanz? Sind Interfaces nicht quasi abstract?
ja es gibt keine instanz eines interfaces
aber wenn du eine klasse hast die dieses Interface implementiert dann kannst du auf diese methoden zugreifen
schau dir mal das kleine beispiel an:
DefaultMutableTreeNode NewNode = new DefaultMutableTreeNode("my node"); MutableTreeNode AnyNode = NewNode; NewNode.anyMutableTreeNodeMethod(); DefaultMutableTreeNode anotherNode = (DefaultMutableTreeNode) NewNode;
erklaerung:
zeile 1 - ist klar - erstellung eines treenodes ueber die DefaultMutableTreeNode klassezeile 2 - zuweisung
der DefaultMutableTreeNode implementiert (auch) das interface MutableTreeNode. das heisst er stellt alle die methoden des interfaces bereit. das wiederum bedeutet er "IST" ein MutableTreeNode.zeile 3 - aufruf
jetzt kann ich jede methode des mutabletreenode interfaces aufrufen weil das objekt das darunter ist implementiert ja diese methoden. aufgepasst: das objekt das darunter ist ist ein DefaultMutableTreeNodedas sieht man in zeile 4:
hier caste ich zurueck und das geht weil das objekt "instanceof" defaultmutabletreenode istso funktionieren zB graphische container
die erwarten sich components/JComponents und brauchen auch nur die methoden die in component/JComponent deklariert sind zum zeichnen
das sind getwidth() getheight() uswlg
gomberl
-
Hi
das seiht etwas komplizieter aus wenn ich mir die api mal so anguck
1. möglichkeit du besorgst dir die liste der Buttons der buttongroup, ButtonGroup.getElements()
oder
2. Möglichkeit du besorgst dier das selektierte Model der buttonGroup.getSelection(). wie man von dort aus weiterkommt, weis ich nicht genau. warscheinlich mit ButtonModel.getSelectedObjects(). Aber die Funktionalität die ButtonModel bereits zur verfügug stellt sollte eigentlich schon mal auschreichen.Irgendwie beschleicht mich der Verdacht, das die Funktionalität des Buttons im ButtonModel implementiert ist ( DefaultButtonModel ) AbstractButton hingegen strunze doof ist und nur die Aufrufe seiner Methoden an das ButtonModel delegiert. Ok er wird sich warscheinlich noch um die darstellung des Buttons kümmern.
zu 2. ButtonModel ist ein interface, wird aber von DefaultButtonModel implementiert. ( ggf auch von anderen, die mir aber nicht bekannt sind. ggf will ja mal jemand ein eigenes schreiben und einhängen. geht ja schlieslich auch. AbstractButton.addModel())
gruss Termite
-
termite hat das richtig erkannt
die Java Swing componenten sind nach dem MVC pattern aufgebaut (die meisten)
das bedeutet
Model - View - Controllerwas sich so ableitet
Das Model ist für die Datenhaltung zustande, es stellt methoden bereit die nötigen daten auszulesenDie View stellt diese Daten nun dar. Das heisst sie sorgt für die Representation der Daten aus dem Model.
Der Controller ist für die Manipulation der Daten verantwortlich.
dies bietet enorme möglichkeiten und es sollte jeder einmal versuchen eine eigene componente auf dieser basis zu entwickeln
man merkt bald die unterschiede und auch die tueckenschoenes wochenende
gomberl
-
Hi
hab ich das jetzt richtig verstanden ein Button implementiert schon deas MVC paradigma.
und wenn ich das dan frame übergreifend betrachte schachteln sich dann die mvc Paradigmen
dann hoff ich mal das ich nicht mehr so tief in den swing eingeweiden rumwühlen mussgruss Termite