03. oktober 2001 - 20:19Der er
9 kommentarer og 2 løsninger
actionlistener??
Hej jeg sidder med en guide her i javabogen ... og jeg er nået til actionlistener... jeg har lavet dette eksempel
import java.awt.*; import java.applet.*; import java.awt.event.*; public class test extends Applet { Label mads = new Label(); Button knap = new Button(); public void init() { mads.setText(\"Yo\"); knap.setLabel(\"Tryk\"); knap.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { knap_tryk(e); } }); indsat(); } public void indsat() { this.add(mads); this.add(knap); } void knap_tryk(ActionEvent e) { mads.setText(\"trykket\"); repaint(); } }
men jeg tænkte ... det med actionlisteneren ... det er da lidt meget at skulel skrive .... hvordan laver man en nem action listerner som fylder mindst og skal kunne have funktion at man skal kunne sende en variabel til den og så skal den gøre noget forskellige alt efter hvad der står i variabelen!!!
ja med to knapper kan det der være måden og faktisk en udemærket måde, som gør at koden for den specifikke actionlistener kun er tilknyttet den enkelte knap.
En anden måde er at du kan lave en ActionListener klasse, ja ok det er jo det du gør med den anonyme klasse.
Men f.eks. tag din applet og lad den implementere actionlistener:
public class test extends Applet implements ActionListener
nu skal du så bare lave en metode i din klasse:
public class test extends Applet implements ActionListener { ... public void actionPerformed(ActionEvent e) { //her kan du så tjekke på hvad e er og udføre en handling //derefter } ... }
nu kan du så bare for hver knap sige knap2.addActionListener(this); knap3.addActionListener(this);
osv.
det er en anden måde man kan gøre det på, som nok skulle spare et par linier.
En simpel løsning er som følger hvor text1 og text2 er knappernes tekst:
ActionListener listener = new ActionListener() { public actionPerformed( ActionEvent e ) { String cmd = e.getActionCommand(); if ( cmd.equals(\"text1\" ) ) { .... } else if (cmd.equals(\"texct2\") ) { .... } } }; knap1.addActionListener(listener); knap2.addActionListener(listener); Alternativt kan du teste med if ( e.getSource().equals(knap1) ) og lignende, men så skal knapperne være erklæret final, så i simple tilfælde er det ikke den foretrukne løsning.
Ja det er også en måde, dvs. hele tre måder at gøre det på
Man kunne også lave en actionlistener klasse som en indre klasse til det panel som den nu hører til(hvis det er tilfældet), hvilket nok er den løsning jeg foretrækker i de fleste tilfælde.
Vil man have en totalt overordnet actionlistener bør man nok splitte den ud i sin egen klasse:
public class MyActionListener implements ActionListener{ ... public void actionPerformed(ActionEvent e) { ..... ..... } ... }
og så i den klasse hvor man har knapper anvende
knap1.add(ActionListener(new MyActionListener());
Så alt i alt mange muligheder og hvad man vælger afhænger i høj grad af den enkelte situation og om designmæssige fordele(f.eks. samhørighed og kobling)
mener man en actionlistener på et par linier(her 7) er for langt bør man nok ikke kode :o) Og jeg har skam set det, men som jeg også skriver så har jeg ikke set dem kortere.... :o)
Synes godt om
Ny brugerNybegynder
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.