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 wurde

    ich 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 sein

    wenn du willst kannst du die listener objekte durchgehen und sehen ob du die button group findest
    aber es besteht keine fixe abhängigkeit

    gomberl



  • 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.ButtonGroup

    gruss 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 klasse

    zeile 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 DefaultMutableTreeNode

    das sieht man in zeile 4:
    hier caste ich zurueck und das geht weil das objekt "instanceof" defaultmutabletreenode ist

    so 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() usw

    lg

    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 - Controller

    was sich so ableitet
    Das Model ist für die Datenhaltung zustande, es stellt methoden bereit die nötigen daten auszulesen

    Die 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 tuecken

    schoenes 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 muss

    gruss Termite


Anmelden zum Antworten