Avatar billede axe2 Nybegynder
06. oktober 2002 - 18:26 Der er 34 kommentarer og
1 løsning

persistens virker ikke

jeg har følgende problem persistens virker ikke i dette program, en Jlist i CdVies klassen opdateres i konstuktøren

public CdView() {
        initComponents();
        setEnabled();
        //getController();
        //getController().load();
        opdaterListe(getController().getModel().getCdContainer());
       
}

resten af koden er her på CdView

import java.util.Vector;
/*
* CdView.java
*
* Created on 3. oktober 2002, 22:56
*/

/**
*
* @author  unknown
*/
public class CdView extends javax.swing.JFrame {
   
    /** Creates new form CdView */
    public CdView() {
        initComponents();
        setEnabled();
        //getController();
        //getController().load();
        opdaterListe(getController().getModel().getCdContainer());
       
    }
   
    /** This method is called from within the constructor to
    * initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is
    * always regenerated by the Form Editor.
    */
    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();
        jPanel2 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jPanel1.setLayout(new java.awt.BorderLayout());

        jPanel1.setBorder(new javax.swing.border.TitledBorder("Cd Buddy"));

        jList1.setSelectionBackground(new java.awt.Color(255, 255, 255));
        jList1.addContainerListener(new java.awt.event.ContainerAdapter() {
            public void componentAdded(java.awt.event.ContainerEvent evt) {
                jList1ComponentAdded(evt);
            }
        });

        jScrollPane1.setViewportView(jList1);

        jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jPanel2.setLayout(new java.awt.GridLayout(1, 0));

        jButton1.setText("Opret Cd");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jPanel2.add(jButton1);

        jButton2.setText("Slet Cd");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jPanel2.add(jButton2);

        jButton3.setText("Gem");
        jPanel2.add(jButton3);

        jButton4.setText("jButton4");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });

        jPanel2.add(jButton4);

        jPanel1.add(jPanel2, java.awt.BorderLayout.NORTH);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
        // Add your handling code here:
        //opdaterListe();
        jList1.setListData(getController().getModel().getCdContainer());
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
      System.out.println(getController().getModel().getCdContainer().size());
      getController().save();// Add your handling code here:
    }

    private void jList1ComponentAdded(java.awt.event.ContainerEvent evt) {
        // Add your handling code here:
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
      new Opret().show();
    }
   
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
       
        getController().save();
        System.exit(0);
    }
    public void setEnabled()  {
    //jButton2.setEnabled(false);
    //jButton3.setEnabled(false);
    //jButton4.setEnabled(false);
    }
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        new CdView().show();
    }
    public static void opdaterListe(Vector v)  {
        jList1.setListData(v);
    }
    private CdController getController()    {
    if(controller == null)
        return controller = new CdController();
    else
        return controller;
    }
   
   
    // Variables declaration - do not modify
    private javax.swing.JButton jButton4;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JButton jButton3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private static javax.swing.JList jList1;
    // End of variables declaration
    private CdController controller;
}

kontroller klassen

import java.util.*;
/*
* CdController.java
*
* Created on 6. oktober 2002, 15:44
*/

/**
*
* @author  unknown
*/
public class CdController {
    private Model model;
    private MyCd cd;
    /** Creates a new instance of Controller */
 
    public void addCd(MyCd cd)  {
    getModel().addToCdItems(cd);
    CdView.opdaterListe(getModel().getCdContainer());
    }
    public Model getModel()    {
    model = Model.getModel();
   
    return model;
    }
    public void save()    {
    getModel().writeModel();
    }
    public void load()  {
        getModel();
    }
   
    public Vector getAllcd() {
      return getModel().getCdContainer();
     
   
    }
}
Avatar billede magoo20000 Nybegynder
06. oktober 2002 - 19:31 #1
Får du nogle runtime/compiletime fejl!?
Avatar billede magoo20000 Nybegynder
06. oktober 2002 - 19:33 #2
public Model getModel(){
    model = Model.getModel();
    return model;
}
Har du en statisk getModel-metode på Model-klassen?
Hvorfor lave private Model model-referencen, når du ikke bruger den?
Avatar billede axe2 Nybegynder
06. oktober 2002 - 19:52 #3
se resten af koden evt model klassen så kan du måske se fejlen
Avatar billede axe2 Nybegynder
06. oktober 2002 - 19:52 #4
import java.io.*;
import java.util.*;
/*
* Model.java
*
* Created on 6. oktober 2002, 15:37
*/

/**
*
* @author  unknown
*/
public class Model implements java.io.Serializable{
    private static CdContainer c = new CdContainer();
    private static Model model;
    private static final String FILSTI = "c:\\model.dat";
    /** Creates a new instance of Model */
    public Model() {
        //c = new CdContainer();
    }
public static void addToCdItems(MyCd cd) {
c.add(cd);
}
public static void removeCd(MyCd cd)  {
c.remove(cd);
}

public static Model getModel()    {
  if (model == null) {
    model = (Model) read();
      if(model == null)
      model = new Model();
  }
    return model;
}

public static Vector getCdContainer()  {
return c.getAllElements(); 
}


public static void write(Object o)  {
    File f = new File(FILSTI);
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(f));
        os.writeObject(o);
        os.close();
    }
    catch(Exception e)  {
    System.out.println("fejl i write");
    }
}//end write

public static Object read()  {
 

    File f = new File(FILSTI);
    Object res = null;
    try {
        ObjectInputStream os = new ObjectInputStream(new FileInputStream(f));
        res = os.readObject();
        os.close();
        //return res;
       
    }
    catch(Exception e)  {
    System.out.println("fejl i read");
    }
 
   
 
  return res;

}
public void writeModel()  {

    write(model);
   
}
public String toString()    {

    return null;
   
}

}
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 20:05 #5
Prøv at skrive e.printStackTrace() i din catch sætninger istedet for System.out.... så får du en liste ud med fejl! Og så skiv lige hvilke fej lder kommer ud!
Avatar billede axe2 Nybegynder
06. oktober 2002 - 20:06 #6
ok, der kommer kun en fejl derfra når jeg fjerner model.dat fra disken, prøver at e.printStackTrace()
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 20:08 #7
Din retur værdi i class Model returnere et objekt det kan du bare bruge, hvis det er en Vector/Container det returnere.
Hus kat typecaste objektet!
Brug den med følgende opdaterListe((CdController)getController().getModel().read());
Avatar billede axe2 Nybegynder
06. oktober 2002 - 20:10 #8
får denne fejl når model.dat er slettet ellers når model.dat er oprettet er der ingen fejl
An unexpected exception has been detected in native code outside the VM.
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION occurred at PC=0x6D066E76
Function=[Unknown.]
Library=(N/A)
NOTE: We are unable to locate the function name symbol for the error
      just occurred. Please refer to release documentation for possible
      reason and solutions.
Current Java thread:
        at sun.awt.windows.WToolkit.eventLoop(Native Method)
        at sun.awt.windows.WToolkit.run(WToolkit.java:240)
        at java.lang.Thread.run(Thread.java:536)
Dynamic libraries:
0x72A00000 - 0x72A2D000        C:\WINDOWS\SYSTEM\DBGHELP.DLL
Local Time = Sun Oct 06 20:19:48 2002
Elapsed Time = 1
#
# The exception above was detected in native code outside the VM
#
# Java VM: Java HotSpot(TM) Client VM (1.4.0-b92 mixed mode)
#
# An error report file has been saved as hs_err_pid4294760471.log.
# Please refer to the file for further information.
#

Avatar billede axe2 Nybegynder
06. oktober 2002 - 20:15 #9
Min JList kan ikke li CdControllere med
opdaterListe((CdController)getController().getModel().read());
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 20:16 #10
Hmm, har du prøvet med System.out... at skrive Objektet ud du læser fra filen og derefter skrive det ud efterfølgende der hvor du bruger det for at lokalisere problemet ?
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 20:23 #11
Ellers prøv at sende mig de klasser det drejer sig om så kan det være jeg kan finde fejlen!
Send det til HenrikH@webmascot.dk
Avatar billede axe2 Nybegynder
06. oktober 2002 - 20:24 #12
ok hvad med hele programmet istedet
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 20:25 #13
Fint, så kigger jeg lige på det :-)
Avatar billede =maddog= Nybegynder
06. oktober 2002 - 20:41 #14
Jeg ville nok lave et sanity check efter filen før jeg prøver at læse den
if (f.exists() && f.canRead() && !f.isDirectory())
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 20:48 #15
Så vidt jeg kan se så er problemet følgende:
Når du opretter en cd så add'er du til en ny controller hver gang og når du så gemmer gemmer du en tom controller uden de cd du har oprettet !
Enten skal du lave en metode hvor du kan hente den fælles controller og derefter add'e til den og så gemme den.
Ellers skal du sende controllere med hver gang du opretter en ny Opret.
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 20:55 #16
Er der en grund til at du har alle de klasser det nemmeste ville være at have to Gui klasser (start, opret), en CdController og og en dataklasse MyCD ?
Det kan hurtig laves istedet for alle de forvirende klasser!
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 21:10 #17
Jeg kan sige så meget at det her virker:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
      MyCd ny = new MyCd("test");
      getController().addCd(ny);
      System.out.println(getController().getModel().getCdContainer().size());
      getController().save();// Add your handling code here:
    }

Dog gemmer den ikke korrekt men den viser det i listen :-)
Avatar billede axe2 Nybegynder
06. oktober 2002 - 21:19 #18
Ja det er rigtigt at jeg har en del klasser, men det er ikke uoverskueligt"for mig", og dog :(, dvs det er den måde vi skal lave på. Med en model der gemmer data, samt har en statisk vector til at lægge cd'er ned i, skulle man jo ikke kunne lægge cd'er ned i en "forkert" vector. Ang controlleren, så opretter man kun en kontroller en gang, den bliver oprettet igen og igen når man bruger opret klassen, er det har du kan se problemet, har testet write og read af uden for programmet og fik ikke fejl med her ?

public CdController getController() {
if(controller == null)
  return new CdController
  return controller
}
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 21:21 #19
Nej, men jeg fik som sagt den til at opdatere JList med koden fra før, problemet er bare at den åbentbart ikke gemmer den rigtige controller, du kan f.eks. ogs teste på hvad der er i controlleren inden den gemmes i filen, hvsi den er tom er det der problemet ligger :-)
Avatar billede axe2 Nybegynder
06. oktober 2002 - 21:23 #20
ok, jeg tror at jeg fatter det nu, skal undersøges nærmere : )
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 21:38 #21
Jeg har kontroller dine klasser lidt og er kommet frem til følgende:
når du bruger write(Object o) på Model er o null, hvilket den ikke burde være!
Derefter tjekkede jeg om Model overhoved bliver skrevet i og Ja jeg to size ud af dine CdContainere og de viser det korekte antal.
Så et eller andet sted derimellem :-) er der et brud på din kode, hvor den er og hvad der er kan jeg ikke lige se, og det er også nok nemmere for dig idet du har kodet det :-)
Avatar billede axe2 Nybegynder
06. oktober 2002 - 21:45 #22
ok ikke null hvad skal man sætte den til ?
Avatar billede hbhansen Nybegynder
06. oktober 2002 - 21:46 #23
Hvad mener du?
Avatar billede dsj Nybegynder
06. oktober 2002 - 22:33 #24
Således laver du en metode, som gemmer et objekt binært til en fil:

import java.io.*;

public static void write(Object o, String filename) {
  try {
    File outFile = new File(filename);
    FileOutputStream outFileStream = new FileOutputStream(outFile);
    ObjectOutputStream outObjectStream = new ObjectOutputStream(outFileStream);
    outObjectStream.writeObject(o);
    outObjectStream.close();
  }
  catch (IOException e) { o = null; }
}

Husk at det objekt 'o' du gemmer, skal implementere java.io.Serializable. Ditto alle objekter som dit objekt 'o' har referernce til (der så også bliver gemt).

Her er metoden til at indlæse filen til et objekt:

public static Object read(String filename) {
  Object o;
  try {
    File inFile = new File(filenamen);
    FileInputStream inFileStream = new FileInputStream(inFile);
    ObjectInputStream inObjectStream = new ObjectInputStream(inFileStream);
    o = inObjectStream.readObject();
    inObjectStream.close();
  }
  catch (Exception exc) {
    o = null;
  }
  return o;
}
Avatar billede axe2 Nybegynder
06. oktober 2002 - 22:52 #25
og hvor er forskellen på det du kommer med, iforhold til det her
public static void write(Object o)  {
    File f = new File(FILSTI);
    try {
      ObjectOutputStream oos =
      new ObjectOutputStream(new FileOutputStream(f));
      oos.writeObject(o);
          oos.close();
    }
    catch(Exception e)  {
    e.printStackTrace();
    }
}//end write

public static Object read()  {
 

    File f = new File(FILSTI);
    //Object res = new Object();
    try {
        ObjectInputStream oos =
                new ObjectInputStream(new FileInputStream(f));
    Object o = oos.readObject();
    oos.close();
    return o;
       
    }
Avatar billede axe2 Nybegynder
06. oktober 2002 - 22:53 #26
java.io.Serializable er implementeret der hvor det skal bruges
Avatar billede dsj Nybegynder
06. oktober 2002 - 23:42 #27
Jeg gav bare det rigtige svar, og så var jeg fri for at skulle kigge din kilometerlange kode igennem, hvor mestedelen ikke har noget med sagen at gøre...

Hvis koden er som jeg har skrevet og det ikke virker og Serializable er implementeret de rigtige steder, er det IKKE koden der er noget galt med.

Nu kan jeg se du nævner EXCEPTION_ACCESS_VIOLATION. Det er en exception der bliver smidt i Windows fra selve din JVM. Det er ikke noget du er herre over eller kan gøre noget som helst ved. Det eneste du kan gøre er at skifte til en JVM du ved er stabil. Du bruger en 1.4-beta ser jeg. Prøv i stedet 1.4.0_01 som er den sidste stabile eller 1.3. Hvis ikke det hjælper må du leve med problemet eller dit program om.

Jeg vil faktisk anbefale, at du deler brugergrænseflade og model op i flere klasser. LAD VÆRE med at gemme et objekt der indeholder brugergrænseflade. Gem kun databærende objekter. Jeg ved ikke hvor meget du ved, men som datamatiker har jeg lært at dele tingene kraftigt op. Problemet kan ligge i at du blander tingene sammen.
Avatar billede hbhansen Nybegynder
07. oktober 2002 - 08:18 #28
Til axe2's forsvar kan jeg sige at koden er delt RIGELIGT op, det er overhoved ikke blandet, det ville du se hvis du havde kigget det "kilometerlange kode" igennem :-)
For det andet så gemmer han kun databærende objekter og ikke brugergrænseflade, det er bare fordi den klasse han gemmer kalder han Model, det er nok der det forvirre!
Avatar billede axe2 Nybegynder
07. oktober 2002 - 08:22 #29
du gentager jo bare en del af koden, der er skrevet engang, desuden hvis du ikke gider at læse kilometer af kode, who cares, så lad da vær, jeg opfatter ikke dit svar som værende tilstrækkeligt.
Avatar billede dsj Nybegynder
07. oktober 2002 - 12:11 #30
Hvorfor er i så aggresive, hvis ikke axe2 er tilfreds med svaret så er det bare fint med mig. Jeg prøver bare hurtigt at komme med nogle ideer, og har de allerede været oppe at vende så ignorer dem da bare og afvis svaret. Det handler da ikke om at skulle forsvare og skælde ud...

Desuden nævnte jeg noget om den fejl du får: EXCEPTION_ACCESS_VIOLATION

Er det den fejl du får hver gang eller hvordan ser fejlen helt præcist ud?
Avatar billede dsj Nybegynder
07. oktober 2002 - 12:19 #31
Gider du eventuelt poste resten af din kode!?
Avatar billede axe2 Nybegynder
07. oktober 2002 - 14:08 #32
har du en mail det vist nemmere for dig eller vil du gerne cutte og paste i den, og lad os få den hyggelige tone frem på eksperten : )
Avatar billede dsj Nybegynder
07. oktober 2002 - 15:02 #33
dj@g-a-f.dk  :)
Avatar billede axe2 Nybegynder
07. oktober 2002 - 17:22 #34
får denne fejl hvis jeg prøver at indlæse modellen

java.io.InvalidClassException: Model; local class incompatible: stream classdesc serialVersionUID = 8950065083596849906, local class serialVersionUID = -6690419920701049063
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:454)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1511)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1425)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1616)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1264)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:322)
        at Model.read(Model.java:68)
        at Model.getModel(Model.java:34)
        at CdView.<init>(CdView.java:25)
        at CdView.main(CdView.java:117)
Avatar billede axe2 Nybegynder
07. oktober 2002 - 19:33 #35
Tak for din tålmodighed -; )
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