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..
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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(); } }
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å
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?
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?
07. november 2004 - 22:55
#5
Ja.
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")
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); }
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"); } } }
07. november 2004 - 23:00
#9
Fordi man kalder en anden metode med det argument.
07. november 2004 - 23:01
#10
Det eksempel bruger netop indre anonyme klasser.
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?
07. november 2004 - 23:06
#12
Tja - sådan kan man vel godt sige det
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
07. november 2004 - 23:23
#14
Ja !
07. november 2004 - 23:23
#15
Og jeg foretrækker som sagt den anden måde at gøre det på
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"); } }
07. november 2004 - 23:36
#17
du kan lægge et svar på samme tid
07. november 2004 - 23:37
#18
Jeg kan godt lide at have det samlet. Jeg kan ikek lide syntaxen for en inner anonymous class.
Kurser inden for grundlæggende programmering