Avatar billede mikkelbm Nybegynder
18. marts 2003 - 19:32 Der er 21 kommentarer og
1 løsning

Serialisering i innnerclass???

Jeg har prøvet følgende kode:

private class MenuListener implements ActionListener

  public void actionPerformed(ActionEvent event) throws Exception
      { 
        Object source = event.getSource();
        .   
        .
        .
        .       
        if (source == gem)
        {
      r.gemCustomer();
      r.gemProduct();
    }
      }
  }

Men får følgende fejlmelding:

actionPerformed(java.awt.event.ActionEvent) in MenuFrame.MenuListener cannot implement actionPerformed(java.awt.event.ActionEvent) in java.awt.event.ActionListener; overridden method does not throw java.lang.Exception
  private class MenuListener implements ActionListener

Nogen der kan hjælpe???
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:34 #1
ActionPerformed kaster ikke en Exception. Du overrider den jo.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:36 #2
Den har følgende signatur actionPerformed(ActionEvent e), hvis du ser i dokumentationen.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:37 #3
Selve logikken til at gemme i en fil bør du have i en anden klasse.
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 19:38 #4
Jeg har prøvet lidt af hver. Og fejlmeldingen hvis jeg ikke kaster Exception lyder:
unreported exception java.lang.Exception; must be caught or declared to be thrown

hvad skal jeg gøre?
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:38 #5
F.eks. :

public class SkrivTilFil{

public void skrivFil (JTextArea tekst, String filnavn){
    try{
        PrintWriter fil = new PrintWriter(new FileOutputStream(filnavn),true);
        fil.print(tekst.getText());
        fil.close();
    }
   
    catch(IOException i){
        tekst.setText("IO-error"+ i.getMessage()+"\n");
        i.printStackTrace();
    }
  }//end method
}

Det kunne være alt muligt andet end et JTextArea.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:40 #6
Det er ikke pænt design, hvis man skriver/læser til filer eller databaser dirkete fra GUI. Lav en seperat klasse - så fremmer du også genbrug!
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 19:41 #7
jeg har lavet en serialiseringsklasse der kan gemme mine objekter væk. Præcis som dit eksempel. Jeg kalder bare metoden igennem flere lag og får så fejlmeddelsen.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:43 #8
Ja, men exceptionhåndteringsansvaret har den klasse, som skriver til filen - du kan ikke kaste en exception i din actionPerformed metode. Se i API dokumentationen - interfacet ActionListener siger, at ingen exceptions kan blive kastet.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:44 #9
public void actionPerformed(ActionEvent event) throws Exception
bliver til
public void actionPerformed(ActionEvent event)
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 19:46 #10
Nu spørger jeg nok dumt, men hvis man tager udgangspunkt i den SkrivTilFil klasse og min actionPerformed. Hvordan vil du så kalde din fil?
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 19:47 #11
Fejlmeddelsen jeg skrev i min første kommentar, er den jeg får hvis jeg ikke skriver throws Exception.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 19:52 #12
Jeg har næsten lavet et eksempel med to klasser. Filklasse og GUI klasse. Hæng på 5 min.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 20:00 #13
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

public class GUITing extends JPanel implements ActionListener {

    private JButton go, afslut;
    private JTextArea resultat;
    private String resudskrift;
    private SkrivTilFil stf;

    public GUITing() {

        setLayout( new BorderLayout() );
        stf = new SkrivTilFil();
        setBackground( Color.yellow );

        go = new JButton( " SØG " );
        go.addActionListener( this );

        afslut = new JButton( " Afslut " );
        afslut.addActionListener( this );

        resultat = new JTextArea( 10, 45 );

        JPanel panel = new JPanel();
        panel.setPreferredSize( new Dimension( WIDTH, HEIGHT ) );
        panel.setLayout( new BoxLayout( panel, BoxLayout.Y_AXIS ) );
        panel.setBackground( Color.orange );//sætter baggrunds farve

        panel.add( Box.createRigidArea( new Dimension( 100, 10 ) ) );

        panel.add( Box.createRigidArea( new Dimension( 100, 20 ) ) );
        panel.add( resultat );

        JPanel knapper = new JPanel();
        knapper.add( go );
        knapper.add( afslut );

        add( knapper, BorderLayout.EAST );
        add( panel, BorderLayout.CENTER );

    }

    public void actionPerformed( ActionEvent e ) {
        if ( e.getSource() == go ) {

            stf.skrivFil( resultat, "FILEN" );

        }
        else if ( e.getSource() == afslut ) {

            System.exit( 0 );
        }
    }

    public static void main( String[] args ) {
        JFrame frame = new JFrame( "XXX" );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        JTabbedPane tp = new JTabbedPane();
        tp.addTab( "Hej", new GUITing() );
        frame.getContentPane().add( tp );
        frame.pack();
        frame.show();

    }

}
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 20:00 #14
import javax.swing.*;
import java.io.*;

public class SkrivTilFil{

public void skrivFil (JTextArea tekst, String filnavn){
    try{
        PrintWriter fil = new PrintWriter(new FileOutputStream(filnavn),true);
        fil.print(tekst.getText());
        fil.close();
    }
   
    catch(IOException i){
        tekst.setText("IO-error"+ i.getMessage()+"\n");
        i.printStackTrace();
    }
  }//end method
 
public void laesFil (JTextArea tekst, String filnavn){
      try{
          BufferedReader bufferedReader = new BufferedReader(new FileReader(filnavn));
          String linie = bufferedReader.readLine();
          while(linie != null){
              tekst.append(linie+ "\n");
              linie = bufferedReader.readLine();
          }
          bufferedReader.close();
      }
      catch(FileNotFoundException e){
          tekst.setText("Filen blev ikke fundet "+e.getMessage()+"\n");
          e.printStackTrace();
      }
     
      catch(IOException e){
          tekst.setText("IO-fejl "+e.getMessage()+"\n");
          e.printStackTrace();
      }
  }//end method
}//end class
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 20:09 #15
Din SkrivTilFil klasse er magen til den jeg har. Problemet er at det jeg skal gemme er en arrayList, som ligger i en klasse der hedder CustomerCatalog. Den bliver kaldt igennem en Controller der hedder Register - deraf variablen r.
Jeg har så lagt metoden til at gemme arrayListen væk i CustomerCatalog-klassen. Kan det ikke lade sig gøre? Eller skal jeg så hente arrayListen ind i GUI-klassen og så kalde Serialiseringsklassen derfra???
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 20:09 #16
Håber du forstår mit spørgsmål.... :)
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 20:14 #17
Magen til - sjovt :-) Du kan godt kalde metoden uden parametre fra din GUI.

Din CustomerCatalog indkapsler altså en ArrayList og står for at gemme persistent i en fil og din controller hedder Register?
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 20:16 #18
Men kan din controllerklasse så ikke instansiere CustomerCatalog (som indkapsler en ArrayList) og sende den med som parameter ned til en SkrivTilFil klasse fra Register controlleren?
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 20:16 #19
Lige nøjagtig. Men jeg kan ikke få det til at virke hvis jeg kalder metoden, som i eksemplet.
Og nej, helt magen til er den nu ikke, men princippet er det samme.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 20:20 #20
Den klasse, som indeholder din ArrayList bør efter min mening ikke have ansvaret for at gemme sig selv. Lav en seperat klasse til det a la SkrivTilFil.
Avatar billede mikkelbm Nybegynder
18. marts 2003 - 20:20 #21
Jo, selvfølgelig kan den det. Det er bare mig der lige skal tænke klart.
Nu virker det sgu...
Tak for hjælpen og eksemplerne.
Avatar billede magoo20000 Nybegynder
18. marts 2003 - 20:22 #22
Super - det er jeg glad for at høre.. Det er vigtigt at have sit design/arkitektur nogenlunde fastlagt inden implementeringen begynder. Men der opstår nogle gange ændringer undervejs er min spæde erfaring:-)
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