Avatar billede data2k.dk Nybegynder
07. november 2004 - 22:42 Der er 17 kommentarer og
1 løsning

anvende actionperformed evt.

Det er ikke lige så meget kun hvordan man anvender det.. men kan en eller anden forklare mig hvordan man skal forstå og anvende dette? I må gerne forklare det ud fra et eksempel med en jButton og en jLabel..
Hvad skal man gøre? er lidt forvirret over ActionPerformed og ActionListener og hvordan de bruges..
Hvordan man knytter til et bestemt ting osv..
Avatar billede arne_v Ekspert
07. november 2004 - 22:46 #1
Vi starter med et eksempel:

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class MultiLookAndFeel extends JFrame implements ActionListener {
  private JButton windows = new JButton("Windows");
  private JButton motif = new JButton("Motif");
  private JButton metal = new JButton("Metal");
  private JButton gtk = new JButton("GTK");
  private JButton java = new JButton("Java");
  private JButton system = new JButton("System");
  public MultiLookAndFeel() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      getContentPane().setLayout(new GridLayout(6, 1));
      windows.addActionListener(this);
      getContentPane().add(windows);
      motif.addActionListener(this);
      getContentPane().add(motif);
      metal.addActionListener(this);
      getContentPane().add(metal);
      gtk.addActionListener(this);
      getContentPane().add(gtk);
      java.addActionListener(this);
      getContentPane().add(java);
      system.addActionListener(this);
      getContentPane().add(system);
      pack();
  }
  public void actionPerformed(ActionEvent e) {
      try {
        if(e.getSource() == windows) {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } else if(e.getSource() == motif) {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
        } else if(e.getSource() == metal) {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } else if(e.getSource() == gtk) {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
        } else if(e.getSource() == java) {
            UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
        } else if(e.getSource() == system) {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
      } catch (ClassNotFoundException e1) {
        e1.printStackTrace();
      } catch (InstantiationException e1) {
        e1.printStackTrace();
      } catch (IllegalAccessException e1) {
        e1.printStackTrace();
      } catch (UnsupportedLookAndFeelException e1) {
        e1.printStackTrace();
      }
      SwingUtilities.updateComponentTreeUI(this);
      pack();
  }
  public static void main(String[] args) {
      MultiLookAndFeel f = new MultiLookAndFeel();
      f.show();
  }
}
Avatar billede arne_v Ekspert
07. november 2004 - 22:48 #2
extends JFrame = hoved klasse i Swing GUI app

implements ActionListener = denne klasse har en actionPerformed metode

metal.addActionListener(this) = når metal JButton klikkes så kør actionPerformed i denne klasse

if(e.getSource() == metal) { = var det metal button der blev klikket på
Avatar billede data2k.dk Nybegynder
07. november 2004 - 22:51 #3
okay e er altså parameteren... og getSource(); en metode som ligger i ActionListener?


så man har altså kun en public void actionPerformed(ActionEvent e) 
? og man bruger den parameter som kommer med til at finde ud af hvilket object som kaldte på den?
Avatar billede data2k.dk Nybegynder
07. november 2004 - 22:54 #4
hmm.. nej kan se man godt kan have flere... fx

public void actionPerformed(ActionEvent e)
        {
          jButton1_actionPerformed(e);
        }

public void actionPerformed(ActionEvent e)
        {
          jButton2_actionPerformed(e);
        }


kører java dem så bare igennem indtil den finder den rigtige metode?
Avatar billede arne_v Ekspert
07. november 2004 - 22:55 #5
Ja.
Avatar billede arne_v Ekspert
07. november 2004 - 22:55 #6
Nej.

Det der giver syntax fejl hvis de er i samme klasse.

(man kan godt lave dem i "indre anonyme klasser")
Avatar billede data2k.dk Nybegynder
07. november 2004 - 22:57 #7
der kommer en parameter med ... men hvorfor bliver parameteren taget med i jButton2_actionPerformed paranteser?


public void actionPerformed(ActionEvent e)
        {
          jButton2_actionPerformed(e);
        }
Avatar billede data2k.dk Nybegynder
07. november 2004 - 22:58 #8
giver det en syntax fejl? se denne kode... der er de i samme klasse

package Telefonbog;

import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JPanel;
import java.awt.Rectangle;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class TelefonbogFrame extends JFrame
{
  private TelefonbogControl tc;
  private JPanel jPanel1 = new JPanel();
  private JTextField jTextField1 = new JTextField();
  private JTextField jTextField2 = new JTextField();
  private JLabel jLabel1 = new JLabel();
  private JLabel jLabel2 = new JLabel();
  private JButton jButton1 = new JButton();
  private JButton jButton2 = new JButton();
  private JLabel jLabel3 = new JLabel();
  private JButton jButton3 = new JButton();
  public TelefonbogFrame()
  {
    try
    {
      jbInit();
      tc = new TelefonbogControl();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }

  }

  private void jbInit() throws Exception
  {
    this.getContentPane().setLayout(null);
    this.setSize(new Dimension(400, 300));
    this.setTitle("Telefonbog");
    jPanel1.setBounds(new Rectangle(0, 0, 390, 265));
    jPanel1.setLayout(null);
    jTextField1.setBounds(new Rectangle(105, 20, 195, 35));
    jTextField2.setBounds(new Rectangle(105, 75, 195, 35));
    jLabel1.setText("Navn");
    jLabel1.setBounds(new Rectangle(10, 20, 70, 35));
    jLabel2.setText("Telefonnummer");
    jLabel2.setBounds(new Rectangle(10, 75, 90, 35));
    jButton1.setText("Indsæt");
    jButton1.setBounds(new Rectangle(105, 145, 85, 35));
    jButton1.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          jButton1_actionPerformed(e);
        }
      });
    jButton2.setText("Find Nummer");
    jButton2.setBounds(new Rectangle(195, 145, 105, 35));
    jButton2.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          jButton2_actionPerformed(e);
        }
      });
    jLabel3.setText(" ");
    jLabel3.setBounds(new Rectangle(15, 235, 370, 25));
    jButton3.setText("Antal");
    jButton3.setBounds(new Rectangle(105, 190, 85, 30));
    jButton3.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          jButton3_actionPerformed(e);
        }
      });
    jPanel1.add(jButton3, null);
    jPanel1.add(jLabel3, null);
    jPanel1.add(jButton2, null);
    jPanel1.add(jButton1, null);
    jPanel1.add(jLabel2, null);
    jPanel1.add(jLabel1, null);
    jPanel1.add(jTextField2, null);
    jPanel1.add(jTextField1, null);
    this.getContentPane().add(jPanel1, null);
  }

  private void jButton1_actionPerformed(ActionEvent e)
  {
    String navn = jTextField1.getText();
    int tlfNr = Integer.parseInt(jTextField2.getText());
    tc.indsætPerson(navn, tlfNr);
    jLabel3.setText("Ny person indsat");
  }

  private void jButton3_actionPerformed(ActionEvent e)
  {
    jLabel3.setText("Der er " + tc.antalPersoner() + " person(er) i telefonbogen");
  }

  private void jButton2_actionPerformed(ActionEvent e)
  {
    String navn = jTextField1.getText();
    int nr = tc.findTlflNrForNavn(navn);
    if (nr >=0)
      jTextField2.setText("" + nr);
    else
    {
      jTextField1.setText("");
      jLabel3.setText("Navnet findes ikke");
    }
  }
}
Avatar billede arne_v Ekspert
07. november 2004 - 23:00 #9
Fordi man kalder en anden metode med det argument.
Avatar billede arne_v Ekspert
07. november 2004 - 23:01 #10
Det eksempel bruger netop indre anonyme klasser.
Avatar billede data2k.dk Nybegynder
07. november 2004 - 23:04 #11
så oversat står der hvis vi nu siger den skal blive udløst hvis man trykker på knappen dette.

public void actionPerformed(ActionEvent "Knap 2 tryk!")
        {
          jButton2_actionPerformed("Knap 2 tryk!");
        }

eller?
Avatar billede arne_v Ekspert
07. november 2004 - 23:06 #12
Tja - sådan kan man vel godt sige det
Avatar billede data2k.dk Nybegynder
07. november 2004 - 23:21 #13
for at se om jeg har forstået det med indre anonyme klasser så har jeg lige klippet koden ud til en af dem..

  jButton1.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          jButton1_actionPerformed(e);
        }
      });


passer det? eller har jeg for meget/lidt kode med? det taget fra det eksempel jeg kopierede ind før
Avatar billede arne_v Ekspert
07. november 2004 - 23:23 #14
Ja !
Avatar billede arne_v Ekspert
07. november 2004 - 23:23 #15
Og jeg foretrækker som sagt den anden måde at gøre det på
Avatar billede data2k.dk Nybegynder
07. november 2004 - 23:35 #16
Gør jeg vist også! Synes koden ligger lidt for spredt på denne måde. Sidste spørgsmål til det her område. Den kode du viste mig
Din kode havde en metode med actionPerformed... den jeg viste har to.. den ene kalder den anden.. er det derfor du foretrækker den måde du viste det på?
eller har jeg misforstået min egen kode ? hehe


jButton2.setText("Find Nummer");
    jButton2.setBounds(new Rectangle(195, 145, 105, 35));
    jButton2.addActionListener(new ActionListener()
      {
        public void actionPerformed(ActionEvent e)
        {
          jButton2_actionPerformed(e);
        }
      });

private void jButton2_actionPerformed(ActionEvent e)
  {
    String navn = jTextField1.getText();
    int nr = tc.findTlflNrForNavn(navn);
    if (nr >=0)
      jTextField2.setText("" + nr);
    else
    {
      jTextField2.setText("");
      jLabel3.setText("Navnet findes ikke");
    }
  }
Avatar billede data2k.dk Nybegynder
07. november 2004 - 23:36 #17
du kan lægge et svar på samme tid
Avatar billede arne_v Ekspert
07. november 2004 - 23:37 #18
Jeg kan godt lide at have det samlet.

Jeg kan ikek lide syntaxen for en inner anonymous class.
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