Avatar billede faceorbit Nybegynder
24. maj 2001 - 20:43 Der er 4 kommentarer og
1 løsning

actions i GUI

Hvis man vil fange actions i en GUI
Hvad er det mest hensigtsmæssigt at
bruge:

actionPerformed()

eller at tilmelde en række listeners
til de enkelte componenter, og lade
deres implementering stå for logikken.

(Alle kommentarer om at der ikke skal
ligge logik i GUI\'en bliver overhørt :)

Hvad er der af fordele og ulemper
Avatar billede lbhansen Nybegynder
24. maj 2001 - 22:03 #1
Der er fordele og ulemper ved begge dele, men i bund og grund er det en smagssag.

Det er overkill at implemterer en listener for hver aktion, og man bruger derfor ofte inner classes til at håndtere dette. Hvis man ikke
er forsigtig med det, bliver handlingskoden spredt ud over det hele. Det kan blive meget grimt.

Personligt plejer jeg at bruge actionPerformed, og uddelegerer til andre metoder ved hjælp af simple if-sætninger. Dette giver en overskuelig
kode
Avatar billede mpultz Nybegynder
25. maj 2001 - 09:01 #2
Jeg er enig med lbhansen langt hen af vejen, men jeg kan nu også godt anbefale brugen af anonyme klasser, f.eks.

myComponent.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e)
  {
    // Et eller andet
  }
}
);

Jeg bruger denne fremgangsmåde hvis den pågældende action listener kun skal bruges et sted i koden. Så slipper man også få at skulle navngive en masse klasser samt at tilføjelsen af listeneren og implementationen af den er samme sted (langt fra altid ønskeligt men i mange tilfælde syntes jeg det er OK).
Avatar billede logical Nybegynder
25. maj 2001 - 09:02 #3
lbhansen: >> overkill at implementere en listener,..man bruger inner classes.

En inner class er nu engang som regel en implementering af et listener interface, så ...?

faceorbit: >>

Spørgsmål om stil, men jeg ville typisk gøre følgende.

En action betyder ofte invokering af en eller evt. flere handlingsmønstre (usecases) som skal udføres, og typisk har man en eller flere controlklasser til at håndtere dette. En action skal derfor mappes ned til den control klasse, som skal udføre tingene. Om man så genanvender en actionlistener, gør sig vel gældende om den skal delegere flere hændelser ned til samme kontrolklasse.

Klasser af forskellig art kan implementere et interface, og derved stiller de en funktionalitet til rådighed. Synligheden af den kan også diskuteres. Hvis jeg vil modtage actions, skal jeg kunne optræde som ActionListener. Hvis jeg implementerer det, gør jeg det public, så alle kan se mig som en ActionListener, og rent faktisk invokere actionPerformed(ActionEvent) uden at der nødvendigvis er tale om en action fra en komponent, jeg havde forventet.

På grund af det, vil jeg altid have indre klasser til at modtage events fra kendte sources, så jeg slipper for et public interface. Suns swing folk har ikke lige tænkt så langt, så eksempelvis til definitionen af metoden JTable.valueChange(ListSelectionEvent) + andre steder, står der følgende i javadoc:

Application code will not use these methods explicitly, they are used internally by JTable.


public class MyGui { // Don\'t extend JFrame
  private JFrame f;
 
  ActionListener action = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      doAction(); // Delegate to MyGui class.
    }
  };

  public MyGui {
  JPanel p = new JPanel();
  JButton b = new JButton(\"Dav\");
  b.addActionListener(action); 
  f.setContentPane(p);
  f.setSize(500,500);
  f.setVisible(true);
  }

  // Protected, så derived classes may improve the scenario without
  // Having to speculate in listeners etc.
  protected void doAction() {
    ModelFramework.identifyModel().performUsecase();
  }
}

Og nu er det i øvrigt sådan, at der skal ligge logik i gui klasserne. Hvordan skal man ellers kunne vise de rigtige oplysninger på de rigtige tidspunkter. Det folk mener (når de fejlagtigt siger ovenstående) er at dit modellag i selv selv skal være robust, dvs. kunne genanvendes selv om der kommer et andet GUI, om dine handlingsbestemte usecases kan fyres af få steder fra, og du har velspecifierede interfaces til din model. De andre kommentarer er rent amatørargumenter for folk, der ikke har fået hår på endnu.
Avatar billede lbhansen Nybegynder
25. maj 2001 - 09:37 #4
Jeg vil bøje mig i støvet for Logical han har det med at vide hvad han snakker om:)
Avatar billede faceorbit Nybegynder
26. maj 2001 - 19:29 #5
logical>> Der er jo en hvis robusthed over dit svar så :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester