[java/swing] JToolBar & JMenuBar dynamisch opbouwen

Pagina: 1
Acties:

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:31
Ik heb met verschillende views te maken van verschillende soorten objecten. Deze hebben ook eigen kijk op hoe de toolbar en de menubar er uit moet komen te zien.

Zodra een view actief wordt gemaakt, moet hij zijn menuitems en toolbar items registreren in GUI.

De views zelf zijn verantwoordelijk over welke menuitems weergegeven moeten worden, en moeten deze ook weer wegkunnen halen indien hij gedeactiveerd wordt.

De meest gebruikte functionaliteit (printen, opslaan, sluiten, etc) die voor elk object gelden lijkt mij het beste in de hoofd menu klasse te zetten. Maar hoe zal ik dan de juiste action aan de buttons moeten geven? door de MenuItems public te maken en dan setAction ofzo?

Zijn hier kant en klare oplossingen voor? of moet ik zelf hier mee aan de slag

[ Voor 22% gewijzigd door PhoneTech op 24-04-2005 15:35 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik denk dat je hier zelf mee aan de slag moet. Wat je zou kunnen doen is om het menu te laten luisteren naar de actieve ActionRepositories (als je ieder scherm ziet als een action repository). Alleen vraag ik me wel af hoe je het wilt oplossen als 2 views nagenoeg dezelfde acties hebben... nu krijg je dus 2 (of meer keer) die nagenoeg zelfde acties in je menu.

Als je werkt met JDestopPane kan je luisteren naar de windows die in front zitten (alhoewel er altijd maar 1 actief zal zijn (ook meteen dat probleem met die dubbele acties opgelost)). Dus je desktoppane luisterd naar de view die actief is, en werkt op basis hiervan het menu bij.

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:31
Ik maar idd gebruik van een JDesktopPane en JInternalFrames.
Ook heb ik een DesktopManager geimplementeerd waarbij de activate frame en deactivateframe overridden zijn
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void deactivateFrame(JInternalFrame f)
    {
        super.deactivateFrame(f);
        ((PAbstractInternalFrame) f).removeAssociatedToolbarAndMenus();
    }
    /**
     * insures that the associated toolbar and menu buttons of 
     * the internal frame are activated as well
     *
     * @param f the internal frame being activated
     */
    public void activateFrame(JInternalFrame f)
    {

        super.activateFrame(f);
        ((PAbstractInternalFrame) f).createAssiosiatedToolbarAndMenus();

    }


vervolgens heb ik in mijn PAbstractInternalFrame (extends JInternalFrame) twee abstracte methoden gezet
Java:
1
2
public abstract void createAssiosiatedToolbarAndMenus();
public abstract void removeAssociatedToolbarAndMenus();


In een daadwerkelijk implementatie van de view:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
public void createAssiosiatedToolbarAndMenus()
    {
        ToolBarAndMenus toolBarAndMenus = viewHandler.getToolBarAndMenus();
        toolBarAndMenus.addToFileMenu(miSave);
        
    }

    public void removeAssociatedToolbarAndMenus()
    {
        ToolBarAndMenus toolBarAndMenus = viewHandler.getToolBarAndMenus();
        toolBarAndMenus.removeFromFileMenu(miSave);
    }


Hier voeg ik dus items toe aan het file menu, en haal items ook weer weg. Opzich behoorlijk fail safe, alleen vind ik het zelf niet echt mooi uit zien. Als er geen schermen geactiveerd zijn, zijn er ook bijna geen knoppen in het menu.

Volgens mij is het mooier om een action listener te implementeren in de view en deze te registreren op de knoppen bij activate, en deregistreren in de deactivate... Is dat ook mogelijk? of haal ik weer een zooi complexiteit op mijn hals...