Avatar billede tendal Nybegynder
21. oktober 2003 - 17:02 Der er 40 kommentarer og
1 løsning

Opdatering af GUI

Hej

Jeg har lavet et program hvor der der 3 vinduer alle JFrames - I hovedvinduet er der en liste med navne. Man kan bevæge sig til et persondata vindue hvor det blandt andet er muligt at slette et af navnene i en tilsvarende liste. I persondata vinduet kan jeg godt få fjernet navnet umiddelbart efter jeg har trykket slet, men jeg kan sgu ikke finde ud af at få listen i hovedvindue opdateret så navnet også forsvinder her.

HJÆLP !!! 100 point
Avatar billede simonvalter Praktikant
21. oktober 2003 - 17:06 #1
tror du skal have fat i observer pattern ..

http://www.patterndepot.com/put/8/observer.pdf
Avatar billede arne_v Ekspert
21. oktober 2003 - 17:13 #2
Muligvis behøver du ikek selv kode det helt fra scratch.

Hvis du bruger JList/JTable og du har en referance til den bagvedliggende
data struktur og du kan kalde fire-et-eller-andet, så skulle den være hjemme.
Avatar billede tendal Nybegynder
21. oktober 2003 - 17:19 #3
Det sidste fik jeg ikke helt fat i
Avatar billede arne_v Ekspert
21. oktober 2003 - 17:31 #4
Inden jeg kaster mig ud i en lang forklaring: bruger du JList/JTable
i main vinduet ?
Avatar billede tendal Nybegynder
21. oktober 2003 - 17:34 #5
Næsten - Jeg bruger List fra AWT'en, men hvis det andet gør det lettere så...
Avatar billede arne_v Ekspert
21. oktober 2003 - 17:51 #6
Med AWT List skal du kalde remove metoden på den.

Typisk vil du vel kalde constructor til din persondata frame
med en referance til hoved frame, så kan du i persondata frame
kalde en public metode i hoved frame som kalder remove på den
list.
Avatar billede arne_v Ekspert
21. oktober 2003 - 17:52 #7
Swing JList er ihvertfald anderledes end AWT List.
Avatar billede tendal Nybegynder
21. oktober 2003 - 17:55 #8
Med referance mener du så at jeg skal sende hovedvinduet med som parameter?
Avatar billede arne_v Ekspert
21. oktober 2003 - 17:57 #9
Ja.
Avatar billede tendal Nybegynder
21. oktober 2003 - 18:00 #10
Det jeg gør er som følger:
I mit personData vindue har jeg en actionListener på en knap
ActionListener Slet = new ActionListener ()  {
        public void actionPerformed(ActionEvent  e)  {
            int t = list1.getSelectedIndex();
            hv.gh.sletSpiller(t);
            hv.gh.save();
            list1.remove(t);
            hv.list1.remove(t);
        }
    };
list1.remove(t) fjerner den fra personData listen, og min mening er da at hv.list1.remove(t) skal fjerne den fra hovedvinduets liste som desværre hedder det samme - men nåh ja det er jo ligegyldigt
Avatar billede tendal Nybegynder
21. oktober 2003 - 18:03 #11
Ok så ikke lige dit "ja"...men men men hvordan sender jeg et vindue med som parameter?
Avatar billede arne_v Ekspert
21. oktober 2003 - 18:31 #12
Hvis hv er dit hoved vindue og list1 er listen så bliver den vel fjernet, så
skal du bare have hoved vinduet gentegnet.

hv.repaint() måske ?
Avatar billede tendal Nybegynder
21. oktober 2003 - 19:06 #13
hv er rigtigt mit hovedvindue, men i mit personData vindue starter jeg med at lave Hovedvindue hv = new Hovedvindue(). Det betyder jo at det er denne instans der bliver repaintet ikke sandt og ikke den der kører i forvejen
Avatar billede arne_v Ekspert
21. oktober 2003 - 19:52 #14
hv.repaint() repainter hv ikke current frame.  repaint() må repainte current.
Avatar billede tendal Nybegynder
21. oktober 2003 - 20:16 #15
Ikke forstået
Avatar billede arne_v Ekspert
21. oktober 2003 - 20:41 #16
hv.repaint() bør da repiant hoved vinduet.

Men det er meget muligt at jeg ikke har forstået hele logikken.
Avatar billede tendal Nybegynder
21. oktober 2003 - 20:51 #17
Det gør den ikke - Det jeg mener er at hv jo er en referance til en instans variabel jeg har lavet øverts i personData vinduet som vist herunder

public class PersonData extends JFrame {
   
    Hovedvindue hv = new Hovedvindue();
   
  List list1 = new List();
  JButton rediger = new JButton();
  JButton slet = new JButton();
osv.

senere kommer så
ActionListener Slet = new ActionListener ()  {
        public void actionPerformed(ActionEvent  e)  {
            int t = list1.getSelectedIndex();
            hv.gh.sletSpiller(t);
            hv.gh.save();
            list1.remove(t);
            hv.list1.remove(t);
        }
    };
og det er her jeg mener at hv jo refererer til min instans variabel og ikke det hovedvindue der i forvejen er åben
Avatar billede arne_v Ekspert
21. oktober 2003 - 20:57 #18
Det er korrekt.

Så du skal nok have noget a la:

public class PersonData extends JFrame {
 
    Hovedvindue hv;

    public PersonData(HovedVindue hv) {
        this.h = hv;
    }

og i hoved vinduet:

  PersonData pd = new PersonData(this);
Avatar billede tendal Nybegynder
21. oktober 2003 - 21:32 #19
Det giver desværre følgende compilerfejl
cannot resolve symbol - constucter PersonData (<anonymous java.awt.event.ActionListener>)

Jeg skal måske lige fortælle at PersonData vinduet bliver kaldt i en ActionListener
Avatar billede arne_v Ekspert
21. oktober 2003 - 21:35 #20
Jeg antog at:
  PersonData pd = new PersonData(this);
blev udført i hoved JFrame'en selv.


Men du har en seperat action listener klasse ?

Så må du jo have hoved vinduer over i dens constructor så den
kan kalde PersonData med den.
Avatar billede tendal Nybegynder
21. oktober 2003 - 21:43 #21
Om jeg har en seperat actionListener klasse mener jeg ikke. Mine actionListener er lavet efter min instansvariabler på følgende måde:
ActionListener PersonData = new ActionListener ()  {
        public void actionPerformed(ActionEvent  e)  {
            PersonData personData  = new PersonData(hv);
            personData.setSize(410,480);
            personData.setVisible(true);
        }
    };

Så hvor vil du have jeg skal putte Hovedvindue ind i den?
Avatar billede tendal Nybegynder
21. oktober 2003 - 21:44 #22
Tag dig ikke af hv i new PersonData(hv) har blot glemt at fjerne det - cut and paste fejl
Avatar billede arne_v Ekspert
21. oktober 2003 - 22:09 #23
Du har faktisk en anonym klasse.
Avatar billede tendal Nybegynder
21. oktober 2003 - 22:11 #24
Ja men hvor skal jeg putte Hovedvindue hv ind????
Avatar billede arne_v Ekspert
21. oktober 2003 - 22:15 #25
Hm.

Godt spørgsmål.

Har du overvejet at snyde ?

PersonData personData  = new PersonData(this);
personData.setVisible(false);

udenfor action listener og så:

personData.setSize(410,480);
personData.setVisible(true);

indeni ?
Avatar billede tendal Nybegynder
21. oktober 2003 - 22:17 #26
Nej det har jeg ikke overvejet, men det tror jeg lige jeg gør, men det er jo ikke den bedste løsning
Avatar billede arne_v Ekspert
21. oktober 2003 - 22:28 #27
Næ.

Men jeg kan ikke lige finde ud af hvordan man finder owner instansen
af outer klassen i en instans af en anonym inner class.
Avatar billede tendal Nybegynder
21. oktober 2003 - 22:45 #28
Den med at snyde kan jeg faktisk ikke få til at virke. Compilerfejl - får <identifier> expected når jeg laver
PersonData personData  = new PersonData(this);
personData.setVisible(false);

udenfor actionListeneren - fatter jeg faktisk ikke helt
Avatar billede arne_v Ekspert
21. oktober 2003 - 22:48 #29
Kan du lige poste et kode fragment ? 5 linier før og 5 linier efter ?
Avatar billede tendal Nybegynder
21. oktober 2003 - 22:52 #30
Af "snydekoden" eller hva???
Avatar billede tendal Nybegynder
21. oktober 2003 - 22:57 #31
public class Hovedvindue extends JFrame //implements Observer
{

  public static final GemHent gh = new GemHent();

  JLabel spillere = new JLabel();
  JLabel antalBaner = new JLabel();
  List list1 = new List();
  JComboBox comboBaner = new JComboBox();
  //snip
    JButton personData = new JButton();
  PersonData personData = new PersonData(this);
  personData.setVisible(false);
 
  ActionListener PersonData = new ActionListener ()  {
        public void actionPerformed(ActionEvent  e)  {
            //PersonData personData  = new PersonData();
            personData.setSize(410,480);
            personData.setVisible(true);
        }
    };

//snip betyder bare at jeg har pillet noget ud
Avatar billede tendal Nybegynder
21. oktober 2003 - 22:58 #32
Om igen har to personData, men det hjælper ikke - har prøvet
Avatar billede arne_v Ekspert
21. oktober 2003 - 23:00 #33
personData.setVisible(false);

skal være inden i en metode !

Put den f.eks. ind  HovedVindue constructor.
Avatar billede tendal Nybegynder
21. oktober 2003 - 23:03 #34
Det gør desværre det at den så ikke kan ses i actionListeneren
Avatar billede arne_v Ekspert
21. oktober 2003 - 23:05 #35
Ikke begge linier:

PersonData personData = new PersonData(this);
personData.setVisible(false);

kun den nederste !
Avatar billede tendal Nybegynder
21. oktober 2003 - 23:12 #36
Perfekt - nu kører det pointene er dine - men inden du får dem. Du skrev tidligere at det jo er at snyde og at du ville se om du kunne finde ud af hvordan man finder owner instansen
af outer klassen i en instans af en anonym inner class. Mener du stadig det??? :o)
Avatar billede arne_v Ekspert
21. oktober 2003 - 23:17 #37
så vil jeg ligge et svar

:-)
Avatar billede arne_v Ekspert
21. oktober 2003 - 23:19 #38
Jeg har læst en del og der synes ikke at være en pæn måde at gøre det på.

HovedVindue xthis; // instans medlem
...
xthis = this; // HovedVinsue constructor
...
PersonData personData = new PersonData(xthis); // action listener

er ikke meget pænere.
Avatar billede tendal Nybegynder
21. oktober 2003 - 23:19 #39
Ja ok -betyder det at du ikke finder ud af det andet?
Avatar billede arne_v Ekspert
21. oktober 2003 - 23:20 #40
Det pæneste vil være at droppe den anonyme indre klasse og lave
en ganske normal klasse med en constructor som tager et HovedVindue
som argument og gemmer det i et instans medlem, som så kan bruges
af actionPerformed.
Avatar billede tendal Nybegynder
21. oktober 2003 - 23:22 #41
Ok - tusind tak for hjælpen. Det var sgu fedt :o)
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