25. februar 2005 - 01:27 Der er 39 kommentarer og
1 løsning

Objekt serielisering vedr. input Stream

Hej alle..

hvis man benytter sig af
try {
      FileInputStream fis = new FileInputStream("data.dat");
      ObjectInputStream ois = new ObjectInputStream(fis);
      characterList = (CharacterList)ois.readObject();
      ois.close();
     
    }catch(Exception e){
    System.out.println(e);
    characterList = new CharacterList();
    }

hvordan virkder den egentligt...

Er det sådan at de følgende klasser der har implements Serializable, bliver instantieret på ny...altså for geninlæst deres konstruktører. Eller er de der bare til fri afbenyttelse.

Jeg har nemlig et problem med at en reference mellem to klasser går tabt...og kun efter at jeg har geninlæst dem fra fil.??
Avatar billede kalp Novice
25. februar 2005 - 01:28 #1
Lyder bare som om du ikke gemmer en reference fra den ene klasse til den anden.
25. februar 2005 - 01:32 #2
referencen, der går tabt er til denne klasse...dvs jeg kan godt finde den men jeg kan ikke benytte mig af f.eks. public void add_c(final Component c)...  og af de mouseEvent, der er implementeret


public class CharIcon implements Serializable
{
  Character character;
  ImageIcon imageicon;
  String iconname;
  JLabel charLabel;
 
  public CharIcon(Character character, String iconname)
  {
    this.iconname = iconname;

    imageicon = new ImageIcon(iconname);
    charLabel = new JLabel(imageicon);

    charLabel.setBounds(new Rectangle(155, 40, imageicon.getIconWidth(), imageicon.getIconHeight())); 
    charLabel.setLocation(8,8);
    charLabel.addMouseListener(new java.awt.event.MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
      {
        if (e.getButton()==3 &&  e.getClickCount() == 2)
            højreDobKlik(e);
        else
         
        if ( e.getClickCount() == 2)
              dobbeltKlik(e);
        }
    });   
      charLabel.setVisible(true);
     
      add_c(charLabel);   
  }
 
  public void add_c(final Component c)
    {    c.addMouseMotionListener(new MouseMotionAdapter()
      {    public void mouseDragged(MouseEvent m)
      {
          c.setLocation((c.getX()+m.getX())-(imageicon.getIconWidth()/2),(c.getY()+m.getY())-(imageicon.getIconHeight()/2));
      }});
          //this.character.characterList.control.gui.desktop.add(c);
         
    }
   
  private void dobbeltKlik(MouseEvent e)
  {
    System.out.println("Dobbeltklik");
    //System.out.println(character.getHitpoints());
  }
  private void højreDobKlik(MouseEvent e)
  {
    System.out.println("højre/Dobbeltklik");
  }
Avatar billede kalp Novice
25. februar 2005 - 01:33 #3
okay som du siger så mister du referencen til denne klasse... men hvilken klasse peger så på det? det er den som skal gemme på en reference til denne
25. februar 2005 - 01:36 #4
Tja, jeg ved ikke...

Jeg kalder denne klassen fra klassen Character med  charIcon = new CharIcon(this, iconname); i konstruktøren.  Og selvfølelig med referencen CharIcon charIcon;
25. februar 2005 - 01:41 #5
Men som jeg sagde er det højst sandsynligt ikke referencen til klassen, der går tabt, men  public void add_c(final Component c) metoden , samt public void mouseClicked(MouseEvent e)
25. februar 2005 - 01:44 #6
har du brug for at se mere kode???
Avatar billede kalp Novice
25. februar 2005 - 01:47 #7
Den er svær at gennemskue. Jeg er lidt usikker på om konstruktøren bliver kørt igen som du spørger om, men tror det ikke for man gemmer jo et objekt og hiver et objekt op igen.

hmm.. du velkommen til at smide mere kode herind der er relevant er sikker på andre også vil være taknemmelige :)
25. februar 2005 - 01:50 #8
Min character klasse er her....minus en masse set/get metoder

public class Character implements Serializable
{
  ArrayList  weaponListCha;
  ArrayList armorListCha;
  CharIcon charIcon;
  private String name;
  private String iconname;
  private int hitpoints;
  private int pp;
  private int ob;
  private int obMod;
  private int db;
  private int dbMod;
  private int offBonus;
  private int defBonus;
  private int penelty;
  private int hitsRnd;
  private int stunRnd;
  private int proneRnd;
  private boolean shield;
  private boolean surpriced;
  private boolean stunned;
  private boolean prone;
  private boolean largeCreature;
 
 
 
  public Character(String name, String iconname, int hitpoints, int pp, int db)
  {
    this.name = name;
    this.hitpoints = hitpoints;
    this.pp = pp;
    this.db = db;
    this.iconname = iconname;
    weaponListCha = new ArrayList();
    armorListCha  = new ArrayList();
    charIcon = new CharIcon(this, iconname);  //setIcon(iconname);
  }
 
  public JLabel getIcon()
  {
  return charIcon.charLabel;
   
  }

  public void addWeaponCha(String type, int ob, String attack, String primCrit, String secCrit, String obMod, int fumble)
  {
  //Character r = (Character)characterList.arrCharacter.get(n);
  weaponListCha.add(new WeaponCha(type, ob, attack, primCrit, secCrit, obMod, fumble));
  }
 
  public void addArmorCha(String type)
  {
  //Character r = (Character)characterList.arrCharacter.get(n);
  armorListCha.add(new ArmorCha(type));
  }
25. februar 2005 - 01:53 #9
problemet er måske

public JLabel getIcon()
  {
  return charIcon.charLabel;
  }

der er når jeg kalder denne metode, efter jeg har loadad filen ind, hvor det går galt
25. februar 2005 - 01:54 #10
nå ja..måske er det ikke return charIcon.charLabel men return charIcon.?????, jeg skal kalde
Avatar billede kalp Novice
25. februar 2005 - 01:55 #11
Du prøver at returne en jlabel... ser lidt mystisk ud
Avatar billede kalp Novice
25. februar 2005 - 01:56 #12
public CharIcon getIcon()
  {
  return CharIcon;
   
  }

prøv denne
Avatar billede kalp Novice
25. februar 2005 - 01:57 #13
oops.. og så skal den som kalder metoden lige gøre klar til at modtage et CharIcon objekt selvfølgelig!

fx.

CharIcon tmp = xxx.getIcon();
25. februar 2005 - 02:02 #14
Ok så sker der følgende

først et udpluk fra den klasse, der kalder metoden incl dit forslag

    Character c = gui.control.søgCharacter(temp);
    CharIcon tmp = c.getIcon();
    gui.desktop.add(tmp);

følgende fejlmeddelelser:

Error(105,29): incompatible types; found: javax.swing.JLabel, required: mypackage1.CharIcon

Error(106,17): method add(mypackage1.CharIcon) not found in class javax.swing.JDesktopPane
Avatar billede kalp Novice
25. februar 2005 - 02:04 #15
ahh okay.. vent .. er din jlabel det objekt man ser på din DesktopPane? det man trykker på osv?
25. februar 2005 - 02:05 #16
Jeg kan ændre CharIcon tmp til Component tmp, men så er vi tilbage ved det gamle
25. februar 2005 - 02:05 #17
ja, det er det
Avatar billede kalp Novice
25. februar 2005 - 02:08 #18
Fint.. så var det før egentlig også rigtigt:) (og koden ser lysere ud for mig nu hehe)

Nu læser jeg det som om du prøver at returnere en charLabel til din desktoppane.. og den har i sig selv ingen metoder og alt det du gerne vil have fat i.. det er jo kun en jlabel!
25. februar 2005 - 02:13 #19
ja..du har fat i noget rigtigt der
Avatar billede kalp Novice
25. februar 2005 - 02:14 #20
Den mister åbenbart de addMouseListener du har smidt på den når du hiver den ud af sit objekt... er ikke sikker
25. februar 2005 - 02:20 #21
Ja..men kun når jeg genindlæser filen.

Når jeg opretter en Character(med charIcon), virker addMouseListener og alle de andre ting fint.....det er det, der er underligt
25. februar 2005 - 02:22 #22
Derfor burde der ikke være noget galt med metodekaldene:

    Character c = gui.control.søgCharacter(temp);
    CharIcon tmp = c.getIcon();
    gui.desktop.add(tmp);

Man skulle tro addMouseListener osv er transient som default
Avatar billede kalp Novice
25. februar 2005 - 02:25 #23
må jeg se der hvor du kalder getIcon() ?
25. februar 2005 - 02:25 #24
kan det evt. være  charLabel.addMouseListener(new java.awt.event.MouseAdapter()
je tænkte nærmere på new java.awt....
25. februar 2005 - 02:26 #25
Det står oppe i Characterklassen lige under konstruktøren
Avatar billede kalp Novice
25. februar 2005 - 02:27 #26
nej det er metoden.. mener der hvor du kalder selve metoden.. hvordan koden ser ud der:)
25. februar 2005 - 02:32 #27
Mener du

private void jButton1_actionPerformed(ActionEvent e)
  { 
    Character c = gui.control.søgCharacter(temp);
    JLabel tmp = c.getIcon();
    gui.desktop.add(tmp); 
  }
Avatar billede kalp Novice
25. februar 2005 - 02:36 #28
yep og er det præcis den samme kode der bliver kørt når du sætter dine ikoner på din desktop for første gang? eller er det en anden ?
Avatar billede kalp Novice
25. februar 2005 - 02:39 #29
Jeg har lige lavet et forsøg...

Oprettede 2 jlabels..

jlabel1 kalder en metode som ændre dens tekst til noget nyt. Den bliver kaldt via. en onmouseclicked listener.

jlabel2 bliver sat til at være ligmed jlabel1.

dvs.

jlabel2 = jlabel1;

jeg klikker så på jlabel2 for at se om den så fungere som jlabel1.... det gør den ikke!

så måske sker der det samme i din kode.. angående tmp.. den får slet ikke den addmouselistener påsat sig.
25. februar 2005 - 02:41 #30
Ja, det er samme kode
25. februar 2005 - 02:44 #31
jeg tror jeg har svaret...men jeg forstår det ikke helt..prøv at se her:

Serialization It is important to note that only AWT listeners which conform to the Serializable protocol will be saved when the object is stored. If an AWT object has listeners that aren't marked serializable, they will be dropped at writeObject time. Developers will need, as always, to consider the implications of making an object serializable. One situation to watch out for is this:

Det står i API'en under Class Component
Avatar billede kalp Novice
25. februar 2005 - 02:50 #32
If an AWT object has listeners that aren't marked serializable

Ved ikke om det betyder du mangler at gøre et objekt serializable...
25. februar 2005 - 02:51 #33
Jeg tror det betyder at jeg specifikt skal Serielisere mine Listeners, ved hjælp at et interface...eller sådan noget
Avatar billede kalp Novice
25. februar 2005 - 02:54 #34
Jeg har lige prøvet standard metoden kunne man ikke.. så må der jo står hvordan man ellers gør det:)
25. februar 2005 - 03:00 #35
Ja, jeg har prøvet det samme...prøver at lave en nested klasse nu..
Avatar billede kalp Novice
25. februar 2005 - 03:10 #36
25. februar 2005 - 03:54 #37
Hej Kalp Jeg har fået den ene af Listeners til at virke...her er et uddrag af CarIcon klassen

Som du kan se har jeg lavet en subClass som implementerer Serializable. Og interfaces MouseListener..derfor alle de tomme metoder.

Nu er det igan med den anden Listener


  charLabel.addMouseListener(new MouseAdapter(charLabel));
    charLabel.setVisible(true);
    add_c(charLabel); 
  }
  public void add_c(final Component c)
    {    c.addMouseMotionListener(new MouseMotionAdapter()
      {    public void mouseDragged(MouseEvent m)
      {
          c.setLocation((c.getX()+m.getX())-(imageicon.getIconWidth()/2),(c.getY()+m.getY())-(imageicon.getIconHeight()/2));
      }});
          //this.character.characterList.control.gui.desktop.add(c);
         
    }
   
  public String geticonname()
  {
    return (String)iconname;
  }

}
class MouseAdapter implements MouseListener, Serializable
{
      JLabel charLabel;
     
      public MouseAdapter(JLabel charLabel)
      {
        this.charLabel= charLabel;
      }
      public void mouseClicked(MouseEvent e)
      {
        if (e.getButton()==3 &&  e.getClickCount() == 2)
            højreDobKlik(e);
        else
         
        if ( e.getClickCount() == 2)
              dobbeltKlik(e);
      }
      public void mouseReleased(MouseEvent e)
      {
       
      }
      public void mousePressed(MouseEvent e)
      {
       
      }
      public void mouseExited(MouseEvent e)
      {
       
      }
      public void mouseEntered(MouseEvent e)
      {
       
      }
    private void dobbeltKlik(MouseEvent e)
  {
    System.out.println("Dobbeltklik");
    //System.out.println(character.getHitpoints());
  }
  private void højreDobKlik(MouseEvent e)
  {
    System.out.println("højre/Dobbeltklik");
  }
}
25. februar 2005 - 04:39 #38
Har også fået den anden til at virke nu...puhaa sikke en kamp
Avatar billede kalp Novice
25. februar 2005 - 09:14 #39
puha alt i alt imens jeg lå og sov hehe
26. februar 2005 - 03:30 #40
Jeg tror sku jeg beholder pointene selv...jeg er ved at løbe tør..;)
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