26. februar 2005 - 04:21 Der er 35 kommentarer og
2 løsninger

metodekald fra inner class

hvor kan jeg ikke på nedenstående kodeuddrag kalde metoden get_name i Character klassen fra inner klassen MouseAdapter MouseAdapter , med kaldet:

  System.out.println(cha.character.get_name());
      (kaldet står næsten i bunden af koden)


public class Character implements Serializable
{
  en masse Attributter
  .......

  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 String get_name()
  {
    return name;
  }
  bla bla bla...
}
.................................................................

public class CharIcon implements  Serializable
{
  Character character;
  ImageIcon imageicon;
  String iconname;
  JLabel charLabel;
  MouseAdapter mouse;
 
  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 MouseAdapter(this, charLabel));
    charLabel.setVisible(true);
    add_c(charLabel); 
  }
  public void add_c(final Component c)
    { 
    c.addMouseMotionListener(new MouseMotionAdapter(this, c));
    }
     
   
  public String geticonname()
  {
    return (String)iconname;
  }


class MouseAdapter implements MouseListener, Serializable
{
      JLabel charLabel;
      CharIcon cha;
      Attacker attacker;
      public MouseAdapter( CharIcon cha, JLabel charLabel)
      {
        this.cha = cha;
        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(cha.character.get_name());
  }
  private void højreDobKlik(MouseEvent e)
  {
    System.out.println("HøjreDobbeltklik");
  }
}
}
26. februar 2005 - 04:22 #1
Og forresten, er der nogen mulighed for at fjerne alle de mange tomme metoder i inner Klassen
26. februar 2005 - 04:25 #2
det skal lige siges at jeg ingen compilerfejl får, men tilgængæld en nullPointerException...så det virker som om jeg ikke kan referere gennem en innerclass...???
Avatar billede arne_v Ekspert
26. februar 2005 - 08:59 #3
Må vi se stack trace ?

Og hvorfor er det lavet som inner class ?
Avatar billede snoop_one Nybegynder
26. februar 2005 - 09:57 #4
Jo du kan blive fri for alle de tomme metoder i inner klassen ved at extende MouseAdapter klassen fra java.awt.event også kun override de metoder du har brug for.
Avatar billede snoop_one Nybegynder
26. februar 2005 - 10:05 #5
sådan som jeg ser der så bliver
  this.character = character
aldrig sat i din charIcon constructor...
26. februar 2005 - 17:20 #6
Hej og tak for kommentarerne....beklager jeg først for kigget på det nu...men som i ser.
Sent i seng sent op...

Først til Arne..Det er lavet som en inner class, fordi jeg var nød til at serielisere begge Listeners...Jeg har været meget rundt omkring, og det var altså løsningen jeg fandt frem til...før virkede mine Listeners ikke efter serielisering, det gør de så nu. Kønt eller ej. P.S hvad vil du havde gjort istedet??

Til snoop one...Ja du havde ret..det var this.character = character...bande svovle%&#¤%
Jeg ved den har været der...engang..hehe
Samt er extende delen klaret

Nu virker det fint...tak.

svar for point
26. februar 2005 - 17:21 #7
Forresten Arne..jeg går ud fra det kan være lige meget med stack trace nu... men har det alligevel interesse , så skriv venligst.
Avatar billede arne_v Ekspert
26. februar 2005 - 17:40 #8
Hvis this.character = character  løser det så er stack trace naturligvis uinteressant.
Avatar billede arne_v Ekspert
26. februar 2005 - 17:43 #9
Jeg tror at jeg ville vælge noget andet end simpel serialisering til
at gemme de objekter med.
26. februar 2005 - 17:51 #10
ok....men så kommer jeg ud på dybt vand...har kun beskæftiget mig med Java i 5 måneder..
hvis du kunne give et hint, så kan jeg selv læse om det..tak
Avatar billede arne_v Ekspert
26. februar 2005 - 18:08 #11
Jeg mener at man kunne nøjes med at serialisere det som har med dinn
applikation at gøre og undlade alt det som hører Swing til.

For CharIcon må det vel være iconname og en eller anden identifikation af
Character - ialt 2 stk. data.
Avatar billede arne_v Ekspert
26. februar 2005 - 18:08 #12
Har du iøvrigt prøvet:

public class CharIcon implements  MouseListener, Serializable {

og så med alle metoderne i CharIcon og ingen inner class ?
26. februar 2005 - 18:46 #13
Hej Arne
Jeg er lidt ude på dybt vand mht seralisering generelt. Til at starte med serialiserede jeg heller ikke CharIcon klassen, men fik bøvl. Den knytter sig jo stramt op af Character Klassen og danner på den måde forbindelse til GUI'en. Eller sagt på en anden måde. Iconet er min fysiske tråd I GUI'en.

Tænker du på at gør nogle metoder transient i CharIcon klassen?

Med hensyn til public class CharIcon implements  MouseListener, Serializable {

så går der bøvl i den, da jeg så skal extende både java.awt.event.MouseAdapter og java.awt.event.MouseMotionAdapter. Det kan man vel ikke vel?  P.S der er flere lyttere med i klassen som jeg ikke har vist, for enkelthedens skyld..
26. februar 2005 - 18:47 #14
rettelse....Iconet er min fysiske tråd I GUI'en til Character
Avatar billede arne_v Ekspert
26. februar 2005 - 18:49 #15
Nej - jeg snakker om at droppe serialisering og lave save/load metoder.

----

Den kode du har postet extender ikke noget.
26. februar 2005 - 18:51 #16
Jeg kaster nogle ekstra point ind hvis du kan svare mig på, hvad, der sker når man

skriver Attacker().setData(bla bla);

frem for

Attacker attacker;


attacker.setData(bla bla);
26. februar 2005 - 18:53 #17
Save/load metoder...ja ok...har aldrig hørt om dem....men det lyder som noget jeg burde sætte mig ind i
26. februar 2005 - 18:55 #18
Ok...snoopy one skrev bare følgende: Jo du kan blive fri for alle de tomme metoder i inner klassen ved at extende MouseAdapter klassen fra java.awt.event også kun override de metoder du har brug for.

Det virkede...
Avatar billede arne_v Ekspert
26. februar 2005 - 18:56 #19
Jeg forstår ikke helt.

Attacker().setData(bla bla);

giver vel syntax fejl hvis Attacker er en class.

Attacker attacker;
attacker.setData(bla bla);

giver vel en null pointer exception.

(new Attacker()).setData(bla bla);

og

Attacker attacker = new Attacker();
attacker.setData(bla bla);

gør det sammen, men i det sidste tilfælde har du en reference  som du kan bruge
senere.
Avatar billede arne_v Ekspert
26. februar 2005 - 18:57 #20
Korrekt - hvis du extender i både klassen og den indre klasse, så kan det ikke
lade sig gøre.
26. februar 2005 - 19:25 #21
Nej ok jeg forstår...

Attacker er en frame. der bliver instantieret fra GUI, ideen er at når jeg dobbeltklikker på mit icon, hente CharIcon klassen data fra Characterklassen og med referenden til Attacker lægger dataerne i den klasse.

Men da der ikke er direkte reference fra CharIconklassen tilbage til Attackerklassen, vil jeg se stort på høj kobling og skyde en genvej.

med f.eks Attacker attacker;
          attacker.setData(bla bla);

Dette gav som du sagde en Nullpointer. Så jeg prøvede med Attacker().setData(bla bla).

Det virkede, idet dataerne ar blevet overført til Attackerklassen.

Problemet er dog nu at dataerne ikke bliver vist i framen..har brugt følgende metode i  Attacker klassen:
public void setData(String names, int hitPoints, int powerPoints);
  {
    name.setText(names);
    hitpoints.setText(""+hitPoints);
    powerpoint.setText(""+powerPoints);
  }
Skal framen opdateres eller hva??
26. februar 2005 - 19:28 #22
jeg tænker at kaldet Attacker().setData(bla bla). instantiere et nyt object af Attackerklassen og lægger dataerne ind der. Mens jeg stadig kigger på det gamle object af Attacker
26. februar 2005 - 19:31 #23
vrøvl..jeg skriver jo selfølgelig new Attacker().setData(bla bla)
Avatar billede arne_v Ekspert
26. februar 2005 - 20:15 #24
Jeg har lavet et lille eksempel.

Det ligner ikke din kode så meget.

Men jeg tror at du kan se pointen.
Avatar billede arne_v Ekspert
26. februar 2005 - 20:15 #25
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class Persist1 extends JFrame implements ActionListener {
    private final static String FILE_NAME = "C:\\p1.dat";
    private JTextField tf1;
    private JTextField tf2;
    private JButton btn;
    public Persist1() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridLayout(3, 1));
        tf1 = new JTextField();
        getContentPane().add(tf1);
        tf2 = new JTextField();
        getContentPane().add(tf2);
        btn = new JButton("Save");
        btn.addActionListener(this);
        getContentPane().add(btn);
        pack();
    }
    public void actionPerformed(ActionEvent e) {
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME));
            oos.writeObject(this);
            oos.close();
        } catch (FileNotFoundException ex) {
        } catch (IOException ex) {
        }
    }
    public static void main(String[] args) {
        Persist1 p1 = null;
        if((new File(FILE_NAME)).exists()) {
            try {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME));
                p1 = (Persist1)ois.readObject();
                ois.close();
            } catch (FileNotFoundException e) {
            } catch (IOException e) {
            } catch (ClassNotFoundException e) {
            }
        } else {
            p1 = new Persist1();
        }
        p1.setVisible(true);
    }
}
Avatar billede arne_v Ekspert
26. februar 2005 - 20:15 #26
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class Persist1X extends JFrame implements ActionListener {
    private final static String FILE_NAME = "C:\\p1x.dat";
    private JTextField tf1;
    private JTextField tf2;
    private JButton btn;
    public Persist1X() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridLayout(3, 1));
        tf1 = new JTextField();
        getContentPane().add(tf1);
        tf2 = new JTextField();
        getContentPane().add(tf2);
        btn = new JButton("Save");
        btn.addActionListener(this);
        getContentPane().add(btn);
        pack();
    }
    public void save(String filename) {
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename));
            oos.writeObject(this);
            oos.close();
        } catch (FileNotFoundException ex) {
        } catch (IOException ex) {
        }
    }
    public static Persist1X load(String filename) {
        Persist1X p1x = null;
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME));
            p1x = (Persist1X)ois.readObject();
            ois.close();
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        } catch (ClassNotFoundException e) {
        }
        return p1x;
    }
    public void actionPerformed(ActionEvent e) {
        save(FILE_NAME);
    }
    public static void main(String[] args) {
        Persist1X p1x;
        if((new File(FILE_NAME)).exists()) {
            p1x = load(FILE_NAME);
        } else {
            p1x = new Persist1X();
        }
        p1x.setVisible(true);
    }
}
Avatar billede arne_v Ekspert
26. februar 2005 - 20:15 #27
import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class Persist2 extends JFrame implements ActionListener {
    private final static String FILE_NAME = "C:\\p2.dat";
    private JTextField tf1;
    private JTextField tf2;
    private JButton btn;
    public Persist2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridLayout(3, 1));
        tf1 = new JTextField();
        getContentPane().add(tf1);
        tf2 = new JTextField();
        getContentPane().add(tf2);
        btn = new JButton("Save");
        btn.addActionListener(this);
        getContentPane().add(btn);
        pack();
    }
    public void save(String filename) {
        try {
            PrintWriter pw = new PrintWriter(new FileWriter(filename));
            pw.println(tf1.getText());
            pw.println(tf2.getText());
            pw.close();
        } catch (FileNotFoundException ex) {
        } catch (IOException ex) {
        }
    }
    public void load(String filename) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(filename));
            tf1.setText(br.readLine());
            tf2.setText(br.readLine());
            br.close();
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
    }
    public void actionPerformed(ActionEvent e) {
        save(FILE_NAME);
    }
    public static void main(String[] args) {
        Persist2 p2 = new Persist2();
        if((new File(FILE_NAME)).exists()) {
            p2.load(FILE_NAME);
        }
        p2.setVisible(true);
    }
}
Avatar billede arne_v Ekspert
26. februar 2005 - 20:16 #28
26-02-2005  20:13              12.935 p1.dat
26-02-2005  20:13              12.936 p1x.dat
26-02-2005  20:13                    9 p2.dat
Avatar billede arne_v Ekspert
26. februar 2005 - 20:17 #29
p2 filen fylder 1/1000 af p1 og p1x

p2 filen er en tekst fil og kan redigeres med notepad mens p1 og p1x er binære

p2 er langt mindre sårbar overfor ændringer i klassen end p1 og p1x
26. februar 2005 - 20:45 #30
ok..det lyder godt med p2...jeg troede simpelthen ikke man kunne gemme andet end tekstformater med de metoder
Avatar billede arne_v Ekspert
26. februar 2005 - 21:11 #31
Det kan man heller ikke.

Men hele pointen er netop af i mit tilfælde er det kun teksten i de to JTextField's
der skal gemmes. Ikke alt JFRame/JPanel/JTextField.

Og jeg tror at du måske også kan nøjes med at gemme det logiske indhold af dine
objekter.
26. februar 2005 - 22:10 #32
Men det gør jeg stort set også. Jeg arbejder med ca 20 Klasser ialt.  Alt til venstre for Min DataList klasse (GUI+ KontrolKlasser) bliver ikke Serialiseret (ca. 12 klassser) Alle klasse til højre bliver serialiseret, da de alle består af List med Data der SKAL gemmes. Jeg må så give dig ret i at, der er problemer med CharIcon klassen, da den jo egentlig er GUI, men den bliver Instantieret fra en ArrayList, der skal serialiseres. Desuden er der sikkert som du selv påpeger det, mange data rundt omkring i klasserne, der er unødvendige at gemme.

Men egentlig er problemet ikke Serialisering mere. Det virker,og det gør ikke noget det fylder mere.

Problemet er snarare spørgsmål 19:25:15  se(19:31:46)
27. februar 2005 - 00:07 #33
Hej Arne smid et svar
Avatar billede arne_v Ekspert
27. februar 2005 - 00:13 #34
svar

husk at bede snoop_one ligge et svar da han svarede på dit oprindelige
spørgsmål
27. februar 2005 - 00:40 #35
det var godt du sagde det, ellers var det glemt..tak


smid et svar snoop one!!
Avatar billede snoop_one Nybegynder
27. februar 2005 - 17:46 #36
Svar - undskyld det kommer så sent...
Avatar billede snoop_one Nybegynder
27. februar 2005 - 17:47 #37
ups
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