[JAVA] JPopupMenu Actionhandlers

Pagina: 1
Acties:

  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 05-05 20:46

Balachmar

The truth is out there

Topicstarter
Ik wil graag een JPopupMenu implementeren, die automatisch gevuld wordt met strings. En als er dan op zo'n string geklikt wordt moet die string gebruikt worden gebruikt worden om iets te doen.

Het lukt mij al wel, om een JPopupMenu te maken.
Het lukt me eigenlijk ook al wel om er een actie aan vast te hangen. Ik kom alleen in de problemen met het krijgen van de string om daar vervolgens weer wat mee te doen.

code:
1
2
3
4
5
6
7
8
9
10
public void drawnDataMenu(Point2D origin){
    JPopupMenu drawnDataPopupMenu = new JPopupMenu("Select QTL");
    JMenuItem close = new JMenuItem("Close");
    MyActionListener actionListener = new MyActionListener();
    close.addActionListener(actionListener);
    drawnDataPopupMenu.add(close);
    drawnDataPopupMenu.add("Willem");
    drawnDataPopupMenu.add("Neil");
    drawnDataPopupMenu.show(mainCanvas, (int)origin.getX(), (int)origin.getY());
}


code:
1
2
3
4
5
class MyActionListener implements ActionListener {
    public void actionPerformed(ActionEvent evt) {
        geneview.UnderDevelopmentException.invoke("Willem");
    }
}


Dit werkt dus in principe. Althans het geeft dus inderdaad die error melding die ik wilde als je op Close klikt. Willem en Neil doen niets, dat weet ik maar dat doet er niet toe even.
Ik wil dus iets kunnen doen met close.
Maar ik kan niet zomaar bij drawnDataPopupMenu, vanaf die class MyActionListener.
Wat ik dus nu zou willen is, dat hij in plaats van Willem als error geeft de String van het JMenuItem, in dit geval dus "Close"

[ Voor 6% gewijzigd door Balachmar op 11-11-2004 11:37 ]

Systeempje; Ballaida of Avalon in GuildWars


Verwijderd

Ongetest:

Java:
1
String menuText = ((JMenuItem) evt.getSource()).getText();


(Ik heb een flauw vermoeden dat wat je wilt, niet is wat je zou moeten willen, maar dit is antwoord op je vraag, geloof ik)

  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 05-05 20:46

Balachmar

The truth is out there

Topicstarter
Wat zou ik dan moeten willen? Want ik ben altijd in om mijn programmeerstijl te verbeteren.
edit:

het werkt in ieder geval wel

[ Voor 21% gewijzigd door Balachmar op 11-11-2004 13:48 ]

Systeempje; Ballaida of Avalon in GuildWars


Verwijderd

Als je in een actionPerformed een event source gaat uitlezen, loop je risico op (hoeft niet per definitie zo te zijn) procedurele code, of op inconsequentheid in manier waarop acties door je programma heen worden verwerkt - zeker als meerdere programmeurs aan 1 project werken of je code wordt lastig leesbaar. Je moet namelijk eerst nagaan welke actionlisteners aan welke knoppen hangen en dan de actionlisteners langslopen.

Wat ik kan aanraden, is om de interface javax.swing.Action te implementeren - bij voorkeur door javax.swing.AbstractAction te extenden. De buttons of menu items halen bij deze manier van werken hun naam en icoon en mnemonic key als properties uit de Action en reageren automatisch op verandering van deze properties.

Je zou dus een UnimplementedAction extends AbstractAction kunnen bouwen met constructor met parameter name die super(name) aanroept. Je kunt dan in de actionperformed de foutmelding met name attribuut aanroepen.

Java:
1
drawnDataPopupMenu.add(new JMenuItem(new UnimplementedAction("Close")));


Deze Action is gemakkelijk te vervangen. Als je alle Action classes bij elkaar in een package zet, los van de GUI classes, is je programma ook meteen overzichtelijker. Goed gekozen naamgeving helpt daarbij, bijvoorbeeld door je actie FileOpen te noemen - gelijk aan de naamgeving in het menu.

  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 05-05 20:46

Balachmar

The truth is out there

Topicstarter
OK, aangezien er ondertussen al 4 mensen aan deze software hebben gewerkt en ik er binnen 6 weken ook weer mee ophoud. En er daarna weer iemand mee verder moet, heb ik de methode toegepast die jij hebt voorgesteld. En die werkt natuurlijk ook goed :D
Namens de mensen na mij, bedankt :P

Systeempje; Ballaida of Avalon in GuildWars