Avatar billede dark_sun Nybegynder
11. februar 2003 - 19:50 Der er 26 kommentarer og
1 løsning

Problem med ArrayList og at gemme

Hejsa
Jeg har et problem med mit program, som jeg næsten er færdig med nu. Programmet er en filmenliste, hvor jeg kan sætte mine filmen ind.
Selve programet går ud på at jeg kan gemme min filmen i en ArrayListe, og derefter gemme listen i en dat fil. Men der er opstået et problem, jeg kan ikke adde en filmen til listen mere. Jeg adder fra en frame, og gemmer i en anden. Der er også sådan det skal være, men det virker bare ikke mere efter at har implementeret Serializable. I kan se min kode her, og håber derved at i kan se hvad fejlen er:

public class Frame1 extends JFrame    {
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel jPanel1 = new JPanel();
  JButton jButton1 = new JButton();
  JTextField jTextField1 = new JTextField();
  EgenList engenList = new EgenList();
  FilmenListe list = new FilmenListe();
  Frame2 frame = new Frame2(this,list);
  JPanel jPanel2 = new JPanel();
  JScrollPane jScrollPane1 = new JScrollPane();
  JTextArea jTextArea1 = new JTextArea();
  JButton jButton2 = new JButton();
  JMenuBar jMenuBar1 = new JMenuBar();
  JMenu jMenu1 = new JMenu();
  JMenu jMenu2 = new JMenu();
  JMenu jMenu3 = new JMenu();
  JMenuItem jMenuItem1 = new JMenuItem();
  JMenuItem jMenuItem4 = new JMenuItem();
  JMenuItem jMenuItem5 = new JMenuItem();
  JMenu jMenu4 = new JMenu();
  JMenuItem jMenuItem2 = new JMenuItem();
  JMenuItem jMenuItem7 = new JMenuItem();
  JMenu jMenu5 = new JMenu();
  JMenuItem jMenuItem3 = new JMenuItem();
  JMenuItem jMenuItem8 = new JMenuItem();
  JMenuItem jMenuItem9 = new JMenuItem();
  JMenuItem jMenuItem10 = new JMenuItem();
  JMenuItem jMenuItem11 = new JMenuItem();
  JMenuItem jMenuItem12 = new JMenuItem();
  JMenuItem jMenuItem15 = new JMenuItem();
  JMenuItem jMenuItem16 = new JMenuItem();
  ImageIcon icon = new ImageIcon("C:/O0803.gif");
  VerticalFlowLayout verticalFlowLayout1 = new VerticalFlowLayout();
  JLabel jLabel1 = new JLabel();
  JButton jButton3 = new JButton();
  StringBuffer buffer = new StringBuffer();
  Crontrol crontrol = new Crontrol();

  /**
  * Constructs a new instance.
  */
  public Frame1() {
    super();
    try  {
      jbInit();

  }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
  * Initializes the state of this instance.
  */

    private void jbInit() throws Exception {
    this.getContentPane().setLayout(borderLayout1);
    this.setSize(new Dimension(477, 385));
    jPanel1.setPreferredSize(new Dimension(100, 40));
    jPanel1.setBackground(Color.blue);
    jPanel1.setLayout(verticalFlowLayout1);
    jButton1.setText("Søg");
    jButton1.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    jTextField1.setPreferredSize(new Dimension(82, 20));
    jTextField1.setFont(new Font("Serif", 0, 14));
    jPanel2.setPreferredSize(new Dimension(240, 270));
    jPanel2.setBackground(Color.blue);
    jScrollPane1.setDoubleBuffered(true);
    jScrollPane1.setPreferredSize(new Dimension(300, 300));
    jTextArea1.setPreferredSize(new Dimension(800, 900));
    jTextArea1.setFont(new Font("Serif", 0, 12));
    jButton2.setText("Exit");
    jButton2.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        jButton2_actionPerformed(e);
      }
    });
    jMenuBar1.setBackground(new Color(236, 233, 216));
    jMenu1.setBackground(new Color(236, 233, 216));
    jMenu1.setText("File");
    jMenu2.setBackground(new Color(236, 233, 216));
    jMenu2.setText("Search");
    jMenu3.setBackground(new Color(236, 233, 216));
    jMenu3.setText("Help");
    jMenuItem1.setText("Help Topics");
    jMenuItem4.setText("About");
    jMenuItem5.setText("new..");
    jMenuItem5.addMouseListener(new java.awt.event.MouseAdapter() {

      public void mousePressed(MouseEvent e) {
        jMenuItem5_mousePressed(e);
      }
    });
    jMenu4.setText("CodeX");
    jMenuItem2.setText("DivX");
    jMenuItem2.addMouseListener(new java.awt.event.MouseAdapter() {

      public void mousePressed(MouseEvent e) {
        jMenuItem2_mousePressed(e);
      }
    });
    jMenuItem7.setText("Xvid");
    jMenuItem7.addMouseListener(new java.awt.event.MouseAdapter() {

      public void mousePressed(MouseEvent e) {
        jMenuItem7_mousePressed(e);
      }
    });
    jMenu5.setText("Typpe");
    jMenuItem3.setText("Krimi");
    jMenuItem8.setText("Action");
    jMenuItem9.setText("Humor");
    jMenuItem10.setText("Kærlighed");
    jMenuItem11.setText("krig");
    jMenuItem12.setText("Eventyr");
    jMenuItem15.setText("Add Filmen");
    jMenuItem15.addMouseListener(new java.awt.event.MouseAdapter() {

      public void mousePressed(MouseEvent e) {
        jMenuItem15_mousePressed(e);
      }
    });
    jMenuItem16.setText("Exit");
    jLabel1.setPreferredSize(new Dimension(90, 10));
    jLabel1.setEnabled(false);
    jButton3.setText("Print Liste");
    jButton3.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        jButton3_actionPerformed(e);
      }
    });
    this.getContentPane().add(jPanel1, BorderLayout.WEST);
    jPanel1.add(jLabel1, null);
    jPanel1.add(jTextField1, null);
    jPanel1.add(jButton1, null);
    jPanel1.add(jButton3, null);
    jPanel1.add(jButton2, null);
    this.getContentPane().add(jPanel2, BorderLayout.CENTER);
    jPanel2.add(jScrollPane1, null);
    jMenuBar1.add(jMenu1);
    jMenuBar1.add(jMenu2);
    jMenuBar1.add(jMenu3);
    jMenu3.add(jMenuItem1);
    jMenu3.add(jMenuItem4);
    jMenu2.add(jMenu4);
    jMenu2.add(jMenu5);
    jMenu1.add(jMenuItem5);
    jMenu1.add(jMenuItem15);
    jMenu1.add(jMenuItem16);
    jMenu4.add(jMenuItem2);
    jMenu4.add(jMenuItem7);
    jMenu5.add(jMenuItem3);
    jMenu5.add(jMenuItem8);
    jMenu5.add(jMenuItem9);
    jMenu5.add(jMenuItem10);
    jMenu5.add(jMenuItem11);
    jMenu5.add(jMenuItem12);
    jScrollPane1.getViewport().add(jTextArea1, null);
    jScrollPane1.getViewport();
    this.setJMenuBar(jMenuBar1);
    this.setResizable(false);
    this.setBackground(Color.blue);
    this.setTitle("Filmen Liste");
  }


  void jButton1_actionPerformed(ActionEvent e)
  {
  this.readFile();
  Collections.sort(list, new CodexComparator());

  Object tal = list.findTyppe(jTextField1.getText());

  //System.out.println(tal.toString());
  String text = tal.toString();
  String text1 = jTextField1.getText();

  if(text.indexOf(text1)>-1)
  {
  jTextArea1.setText(tal.toString());
  }
else
{
jTextArea1.setText(jTextField1.getText()+" "+":findes ikke i listen");
}
}

public void writeToFile()
  {
  try
  {
  ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("fl.dat"));
  out.writeObject(list);

  }
  catch(IOException ioe)
  {
  System.out.println(ioe);
  }
}


  public void readFile()
  {
  try
  {
  ObjectInputStream in = new ObjectInputStream(new FileInputStream("fl.dat"));
  list =(FilmenListe) in.readObject();
  }
  catch(IOException ioe)
  {
  System.out.println(ioe);
  }
  catch(ClassNotFoundException cnfe)
  {
  System.out.println(cnfe);
  }

}





  void jButton2_actionPerformed(ActionEvent e)
  {
  this.writeToFile();
  System.exit(0);

  }

  void jMenuItem5_mousePressed(MouseEvent e)
  {

  engenList.setVisible(true);

  }

  void jMenuItem15_mousePressed(MouseEvent e)
  {
  frame.show();
  }

  void jButton3_actionPerformed(ActionEvent e)
  {

  this.readFile();
  for(int i=0;i<list.size();i++)
  {
  buffer.append(((Filmen)(list.get(i))));

  jTextArea1.setText(buffer.toString());

  }

}

  void jMenuItem2_mousePressed(MouseEvent e)
  {
  this.readFile();
  Collections.sort(list,new CodexComparator());

  Object tal = list.findCodex("DivX");

  String text = tal.toString();
  String text1 = jTextField1.getText();

  if(text.indexOf(text1)>-1)
  {
  jTextArea1.setText(tal.toString());
  }
else
{
jTextArea1.setText(jTextField1.getText()+" "+":findes ikke i listen");
  }
}

  void jMenuItem7_mousePressed(MouseEvent e)
  {
  this.readFile();
  Collections.sort(list,new CodexComparator());

  Object tal = list.findCodex("Xvid");

  String text = tal.toString();
  String text1 = jTextField1.getText();

  if(text.indexOf(text1)>-1)
  {
  jTextArea1.setText(tal.toString());
  }
else
{
jTextArea1.setText(jTextField1.getText()+" "+":findes ikke i listen");
  }
}
}
-------------------------
  public class Frame2 extends JFrame  {
  BorderLayout borderLayout1 = new BorderLayout();
  JPanel jPanel1 = new JPanel();
  FilmenListe list;
  Crontrol crontrol = new Crontrol();
  JTextField jTextField1 = new JTextField();
  JTextField jTextField2 = new JTextField();
  JTextField jTextField3 = new JTextField();
  JButton jButton1 = new JButton();




  /**
  * Constructs a new instance.
  */
  public Frame2(Frame1 f,FilmenListe list ) {
  try
  {
      this.list =list;
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
  * Initializes the state of this instance.
  */
  private void jbInit() throws Exception {
    this.getContentPane().setLayout(borderLayout1);
    this.setResizable(false);
    this.setSize(new Dimension(362, 79));
    jPanel1.setBackground(Color.blue);
    jTextField1.setPreferredSize(new Dimension(63, 20));
    jTextField1.setText("Titel");
    jTextField2.setPreferredSize(new Dimension(63, 20));
    jTextField2.setText("CodeX");
    jTextField3.setPreferredSize(new Dimension(63, 20));
    jTextField3.setText("Typpe");
    jButton1.setText("Add en Filmen");
    jButton1.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    this.getContentPane().add(jPanel1, BorderLayout.CENTER);
    jPanel1.add(jTextField1, null);
    jPanel1.add(jTextField2, null);
    jPanel1.add(jTextField3, null);
    jPanel1.add(jButton1, null);
  }




  void jButton1_actionPerformed(ActionEvent e)
  {
  String a = jTextField1.getText();
  String b = jTextField2.getText();
  String c = jTextField3.getText();
  list.add(new Filmen(a,b,c));

  }

--------------------
public class Filmen implements Serializable  {

  private String titel;
  private String codex;
  private String typpe;

  public Filmen(String titel, String codex, String typpe)
  {
  this.titel = titel;
  this.codex = codex;
  this.typpe = typpe;
  }
  public String gettitel()
  {
  return titel;
  }
  public String getCodex()
  {
  return codex;
  }
  public String getTyppe()
  {
  return typpe;
  }
  public String toString()
  {
  return ("Titel:"+titel+"\n"+"Codex:"+codex+"\n"+"Typpe:"+typpe+"\n"+"\n");
  }
}
-------------------------------------
public class FilmenListe extends ArrayList implements Serializable      {

  /**
  * Constructor
  */

public StringBuffer findTitel(String titel)
  {
  StringBuffer buffer = new StringBuffer();
  Filmen filmen;
  for (int i = 0; i < size(); i++)
  {
  filmen = (Filmen)get(i);
  if(filmen.gettitel().equalsIgnoreCase(titel)) buffer.append(filmen);
  }
  return buffer;
  }

  public StringBuffer findCodex(String codex)
  {
  StringBuffer buffer = new StringBuffer();
  Filmen filmen;
  for (int i = 0; i < size(); i++)
  {
  filmen = (Filmen)get(i);
  if(filmen.getCodex().equalsIgnoreCase(codex)) buffer.append(filmen);
  }
  return buffer;
  }

  public StringBuffer findTyppe(String typpe)
  {
  StringBuffer buffer = new StringBuffer();
  Filmen filmen;
  for (int i = 0; i < size(); i++)
  {
  filmen =(Filmen)get(i);
  if(filmen.getTyppe().equalsIgnoreCase(typpe)) buffer.append(filmen);
  }
  return buffer;
  }
}

Håber at der er en der gider bruge sin tid, på mit problem. :-0
Avatar billede =maddog= Nybegynder
11. februar 2003 - 20:03 #1
Skal det forstås sådan at du ændret klassen FilmenListe undervejs. Altså at du har gemt nogle film og derefter ændret objektet. Hvis det er tilfældet virker det naturligvis ikke. De informationer der er gemt i filen forudsætter jo en hkendt funktionalitet i den klasse den tilhører.
Det skal lige tilføjes - TROR JEG NOK. Det kan være du skal vente på disky.
Avatar billede dark_sun Nybegynder
11. februar 2003 - 20:21 #2
Jeg har implementeret Serializable som det sidste, da jeg først nu har lavet min ObjectInputStream/ObjectOutputStream metode. Alt det andet blev lavet før, og det er først efter det, at det ikke virker. Hvis jeg fjerner Serializable, viker det
Avatar billede arne_v Ekspert
11. februar 2003 - 20:29 #3
Det er rimeligt meget kode at skulle overskue hurtigt - og der mangler
alligevel så meget at man ikke kan prøve at køre det.

Hvad sker der helt præcist ? Får du en exception eller ... ?
Avatar billede dark_sun Nybegynder
11. februar 2003 - 21:44 #4
Nej, den adder bare ikke filmen over fra frame2 til listen. Men det gør den hvis jeg fjerner Serializable. Skal man ikke kun implementer Serializable i en klasse. I filmenListen, eller er jeg galt på den. Jeg har gjort det 2 steder, for hvis jeg fjerner den fra filmen, siger den at den skal bruge den. Men fra filmenlisten kommer den med en fejl, hvis jeg fjerner den.
Avatar billede arne_v Ekspert
11. februar 2003 - 21:50 #5
For at du kan serialisere et objekt skal objektet implementere serializable
og alle objekter som det indeholder skal også implementere serializable.
Avatar billede dark_sun Nybegynder
11. februar 2003 - 21:53 #6
Ok, så skal begge 2 være Serializable. Kan det have nået med det her at gøre.
public Frame2(Frame1 f,FilmenListe list ) {
  try
  {
      this.list =list;
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
altså den måde hvorpå frame 2 kender listen
Avatar billede arne_v Ekspert
12. februar 2003 - 09:25 #7
Det ser helt OK ud.
Avatar billede dark_sun Nybegynder
12. februar 2003 - 15:42 #8
Ok, så ved jeg sku ikke hvad der er galt. Men er der nået jeg kan gøre, for at det kan gør der lettere at finde fejlen.
Avatar billede arne_v Ekspert
12. februar 2003 - 15:55 #9
Kunne du gøre hele koden tilgængelig, så man kunne prøve at køre den og
selv debugge lidt ?
Avatar billede dark_sun Nybegynder
12. februar 2003 - 16:00 #10
Det skal lige siges at, jeg nu igen har prøvet at fjerne Serializable i mine 2 klasser. Så kan jeg godt adde en filmen til min liste, men så kan jeg desvære jo ikke bruge min save funktion (ObjectInputStream/ObjectOutputStream). Håber virklig at der er en der kan hjælpe. Jeg smider gerne 30 points mere, hvis der er en der kan løse mit problem.:-)
Avatar billede dark_sun Nybegynder
12. februar 2003 - 16:10 #11
Det vil jeg da gerne, det skal lige sige at jeg bruger JDeveloper. Skal jeg bare sætte alt koden ind her?.
Avatar billede arne_v Ekspert
12. februar 2003 - 16:17 #12
Det nemmeste vill være hvis du kunen zippe al koden og ligge den op, så
vi kunne downloade den.

Men ellers kan du jo poste hele koden her.

Det betyder ikke noget at du bruger JDeveloper.
Avatar billede dark_sun Nybegynder
12. februar 2003 - 16:33 #13
Hvordan ligger jeg den op som en zippe fil?.
Avatar billede dark_sun Nybegynder
12. februar 2003 - 16:36 #14
Kan ikke få dem fra min ftp server?
Avatar billede arne_v Ekspert
12. februar 2003 - 16:36 #15
Det kræver at du har adgang til en web-server - enten selv kører
en eller har plads hos din ISP. De fleste ISP stiller en 10 MB
web-plads til rådighed for de fleste kunder.
Avatar billede arne_v Ekspert
12. februar 2003 - 16:42 #16
Hvis din FTP-server er tilgængelig fra internet kan vi sagtens
snuppe dem derfra.
Avatar billede dark_sun Nybegynder
12. februar 2003 - 17:17 #17
I kan hente alt min kode nu, i et text-dokument nu på min ftp-server.
Bruger-navn: FilmenListe
Kode: Filmen
IP:80.196.143.16

Men nu i har alt min kode, kan i så ikke løse et andet problem jeg har. Kun hvis i gider. Kan en af jer, ikke sætte et image i min JFrame og et i mit JPanel. Ved godt at det er meget jeg kræver af jer, men kan sku ikke finde ud af det. :-)
Avatar billede arne_v Ekspert
12. februar 2003 - 17:46 #18
Jeg har hapset filen og prøver at kigge på det.
Avatar billede arne_v Ekspert
12. februar 2003 - 20:55 #19
Jeg har kigget lidt på det og tror jeg har et bud på problemet !

Frame1's constructor indeholder:

Frame2 frame = new Frame2(this,list

Frame1's readFIle indeholder:

list =(FilmenListe) in.readObject();
 
Frame2's constructor indeholder:

this.list =list;
     
Frame2's action har en:

list.add(new Filmen(a,b,c));

Min hypotese er at følgende sker:

* Frame1 constructor opretter en FilmenListe og gemmer en referance i list
* Frame2 constructor gemmer en kopi af den liste
* Frame1 readFile creater en ny FilmenListe og referancen til den gemmes også
  i list og overskriver referancen til det første objekt
* Frame2 adder til det første objekt
* Frame1's nye objekt indeholder naturligvis ikke det addede
Avatar billede arne_v Ekspert
12. februar 2003 - 20:56 #20
Mit forslag til løsning er at readFile ændres til
at læse en temporær FilmenListe fra fil og så looper
du gennem listen og flytter alle Filmen over i den rigtige
liste som list peger på.

På den måde vil Frame1 og Frame2 referere tild et samme objekt.
Avatar billede arne_v Ekspert
12. februar 2003 - 22:44 #21
Med hensyn til billeder, så er det ikke lige min stærke side, men
lidt søgning på nettet fandt bl.a. følgende som virker nemt at gå til:

http://www.javaworld.com/javaworld/jw-02-1997/jw-02-howto_p.html
Avatar billede arne_v Ekspert
12. februar 2003 - 22:44 #22
Og du skal ikke lade dig distrahere af at artiklen snakker om applets.

Det skal også virke i en applikation.
Avatar billede dark_sun Nybegynder
12. februar 2003 - 23:16 #23
Tak skal du have for dit svar. Men Kan du ikke lige lave et eksempel, på din løsning. Det vil blive meget glad for, og så skal du nok få din points for dit arbjde. Tak :-)
Avatar billede arne_v Ekspert
13. februar 2003 - 09:58 #24
Jeg prøver.
Avatar billede arne_v Ekspert
13. februar 2003 - 10:11 #25
Jeg lavede følgende ændringer:

1)  lavede readFile om til:

    public void readFile() {
        try {
            ObjectInputStream in =
                new ObjectInputStream(new FileInputStream("filmen.dat"));
            list.addAll((FilmenListe) in.readObject());
        } catch (IOException ioe) {
            System.out.println(ioe);
        } catch (ClassNotFoundException cnfe) {
            System.out.println(cnfe);
        }

    }

2)  kaldte readFile i Frame1 constructor:

    public Frame1() {
        super();
        readFile();
        try {
            jbInit();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3)  Slettede alle andre kald af readFile (i alle action events).

Og så ser det ud som den gemmer korrekt.
Avatar billede arne_v Ekspert
13. februar 2003 - 21:44 #26
Har du prøvet ?
Avatar billede dark_sun Nybegynder
14. februar 2003 - 16:51 #27
Mange tak skal du have for, nu virke det som det skal. Jeg kan nu lave mit program færdigt. Du skal have dine points, for et virklig godt stykke arbejde. :-)
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