[Java swing] Events hoger oppakken JFrame <JIntern

Pagina: 1
Acties:

  • MLS
  • Registratie: Oktober 1999
  • Laatst online: 18:08
Ik heb nu een programma waarin wat als volgt is opgebouwd:
code:
1
2
3
4
5
JFrame
  |
  |----- JInternalFrame1
  |----- JInternalFrame2
  |----- JInternalFrame3

Dus een JFrame waarin (evt. meerdere) JInternalFrames zitten.

Nu wil ik de events van die JInternalFrames hoger oppakken dan in de JInternalFrame zelf (dus bij de JFrame afhandelen). Dus ik druk een knop in in JInternalFrame1 en JFrame ontvangt die in zijn "public void actionPerformed(ActionEvent event)" en gaat daar mee aan de slag.

Ik heb het nu heel lelijk opgelost door met de constructor van een nieuwe class extends JInternalFrame, de aanroepende JFrame mee te sturen. Maar volgens mij moet dit ook handiger/mooier kunnen.

Kan je iets doen met dat ancester gebeuren? en zo ja hoe werkt dat? Tnx.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

parent mischien?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 18:25
Je kan toch in je creator (niet de constructor, maar de class waarin je de frames aanmaakt) van je InternalFrames het JFrame als actionListener adden aan je InternalFrames?

Verwijderd

als je je hoofdframe een of andere eventlistener laat implementen, dan kun je die gewoon toewijzen aan je JInternalframe:
code:
1
2
3
4
5
6
7
8
9
/* in je JInternalFrame, aan te roepen NADAT ze aan het hoofdframe zijn toegevoegd: */

private void setupEventHandler()
{  Container topLevelParent = getTopLevelAncestor();//frame
   
   if (topLevelParent instanceof ActionListener)
   {   addActionListener((ActionListener)topLevelParent);
   }
}

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

Alarmnummer

-= Tja =-

antwoord met design pattern.
Ga even op zoek naar de 'chain of responsibility' design pattern. Dat kun je hier goed voor gebruiken.
http://www.patterndepot.com/put/8/JavaPatterns.htm

opm:
het is niet goed om een JFrame een algemene actionListener voor je hele scherm te laten implementeren. Je kan veel beter per luisterbaar component (button, checkbox) een interne class maken die ActionListener implementeerd of van AbstractAction extends.

En ik denk dat jouw manier (meegeven aan constructor) wel oke is. Maar ik vind het een beetje vreemd wat je in het geheel doet.

  • MLS
  • Registratie: Oktober 1999
  • Laatst online: 18:08
Aha!
Tnx voor de nuttige tips!

  • MLS
  • Registratie: Oktober 1999
  • Laatst online: 18:08
Ik zal mijn 'structuur' even voorleggen (ik ben het er absoluut mee eens dat het niet echt is wat je wil)...

Ik maak een app, die als volgt moet handelen:
code:
1
2
3
4
5
JFrame (windowManager)
 |
 |-- Login Scherm <-> Hoofdmenu <-> reserveren
                      <-> ander windowtje
                      <-> ander windowtje2

dus je krijgt als structuur een JFrame windowManager het loginscherm oproept. Vervolgens reageert de button in het loginscherm en opent het hoofdmenu. Het hoofdmenu opent dan één van de 3 schermen... Dat kan ik allemaal natuurlijk keurig in de classes die de buttons bevatten zelf maken, maar: ik wil ook terug kunnen (soort wizzard).
Als ik nu vanuit 'reserveren' weer terug wil naar het hoofdmenu (zonder verlies van data etc.), moet ik in 'reserveren' dus de class 'hoofdmenu' hebben...
Ik vind het lelijk om daar de constructor voor te verminken.
Is daar een mooie manier voor (het aanroepen van het frame wat jou heeft aangeroepen)?
Of moet ik een void maken die je kan aanroepen en de parent zetten (type oplossing van websjwans)?
Of kan het het mooist met de oplossing van alarmnummer?

Ik heb dus om deze reden alles centraal laten beheren door mijn windowManager class. Die gewoon instanties houdt van de reeds voorbijgekomen classes.

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

Alarmnummer

-= Tja =-

Ik zou hier een model voor op gaan stellen waar die schermen op reageren. Dat is denk ik veel handiger. Gecompliceerde GUI dingen in GUI code is een nachtmerrie :)

  • MLS
  • Registratie: Oktober 1999
  • Laatst online: 18:08
Hoe bedoel je dat precies?
Een subclass achtig iets waarheen ik de events doorpass en hem daar laat afhandelen? (Kan je daar misschien een structuurdiagrammetje van maken zoals ik hierboven heb gedaan?)
Dit is de eerste keer dat ik een Swing pakketje maak, heb hiervoor behoorlijk wat gedaan met 'commandline' Java. Maar dingen als opbouwstructuur zijn hier toch wat vaag als je er nieuw mee bent. :z
Pagina: 1