Avatar billede ladbye Nybegynder
09. maj 2007 - 11:08 Der er 13 kommentarer og
2 løsninger

Invoke method i Jframe når JDialog lukkes

Jeg står med det problem, at jeg har en JFrame hvorfra der er en knap der åbner en JDialog, med en række felter og 2 knapper. Trykker man på den ene knap i den JDialog, skal JFramen opfange dette tryk og køre en metode.

Ved godt det er en listener jeg skal have smidt på, men hvordan skal den lige klares? Nogen der evt. har et eksempel jeg kan se på?

På forhånd tak ...
Avatar billede mikkelbm Nybegynder
09. maj 2007 - 11:24 #1
Smid din JFrame med i constructoren på din dialog. Så har du adgang til alle public metoder på framen.
Avatar billede ladbye Nybegynder
09. maj 2007 - 12:45 #2
Jeg har gjort følgende:

class JFrame
{
    static JFrame frame = null;

    public JFrame()
    {
      frame = this;
    }

    //constructor i en actionPerformed
    new DialogWindow(frame, ...)
}

Og i den anden klasse:

Class DialogWindow
{
    private GUI gui = null;

    public DialogWindow()
    {
      this.gui = gui;
    }

    //kald fra actionPerformed ...
    gui.metodeKald();
}

Men det kald jeg bruger virker åbenbart ikke. Er det rigtigt nok som jeg har gjort?
Avatar billede ladbye Nybegynder
09. maj 2007 - 12:46 #3
Lige en rettelse. Det er selvfølgelig:

public DialogWindow(GUI gui, ...)
Avatar billede ladbye Nybegynder
09. maj 2007 - 12:48 #4
Som jeg dog kager rundt i det - ikke nemt når man prøver at følge undervisning samtidig.

class JFrame
{
    static JFrame frame = null;

    public JFrame()
    {
      frame = this;
    }

    //constructor i en actionPerformed
    new DialogWindow(frame, ...)
}

Og i den anden klasse:

Class DialogWindow
{
    private JFrame frame = null;

    public DialogWindow(JFrame frame, ...)
    {
      this.frame = frame;
    }

    //kald fra actionPerformed ...
    frame.metodeKald();
}
Avatar billede sse77 Nybegynder
09. maj 2007 - 13:05 #5
Det du gør er at du lader den klasse som skal reagere på trykket på knappen, arve fra actionlistener, og så sender du den klasse med over til der hvor knappen er og skriver

knap.addActionListener(klasse);

så skal du bare lave actionperformed i den klasse som du arvede actionListener fra.
Avatar billede mikkelbm Nybegynder
09. maj 2007 - 13:18 #6
Det er nok ikke smart at kalde din klasse for JFrame :)
Avatar billede ladbye Nybegynder
09. maj 2007 - 13:39 #7
Mikkelbm -> Nej, det hedder den heller ikke - det var bare lige her i denne repræsentation af min kode, at jeg valgte at kalde den JFrame så det var nemt at se hvilken klasse der var hvad :)
Avatar billede mikkelbm Nybegynder
09. maj 2007 - 13:53 #8
sse77 >>

Som jeg har forstået spørgsmålet skal der sendes nogle data med i kaldet til hoved-framen - og derfor vil dit forslag ikke virke.

ladbye >>

Umiddelbart ud fra din pseudo-kode ser fremgangsmåden korrekt ud.
Avatar billede ladbye Nybegynder
09. maj 2007 - 13:58 #9
Altså der skal ikke sendes nogle data med i kaldet til hoved-framen. Den skal bare køre en metode jeg har i hovedframen der hedder refreshTable().

Scenariet er det, at jeg har en program til håndtering af studerende i en database. Der har jeg en hovedframe med et GUI-interface og et JTable med en liste af studerende, hentet fra DB. Dertil en række knapper, f.eks. "Tilføj" der åbner en JDialog hvor man tilføjer en ny studerende. Når man trykker tilføj i det vindue, skal min JTable opdateres, dertil funktionen refreshTable() i min hovedframe.
Avatar billede ladbye Nybegynder
09. maj 2007 - 14:14 #10
Ved ikke lige hvorfor det ikke virkede før, men nu virker det - med den pseudo-kode jeg har :) Mikkelbm, siden din kommentar førte mig til løsningen, kan du smide et svar og få lidt point ...
Avatar billede sse77 Nybegynder
09. maj 2007 - 14:18 #11
class MainFrameController implements ActionListener{

public MainFrameController(){
MainFrame frame = new MainFrame(this);
mainFrame.setVisible(true);
}

public void actionPerformed(ActionEvent evt){
if(((JButton)evt.getSource).getName().equals("frameOk"){
//performOk();
}
else if ((JButton)evt.getSource).getName().equals("dialogAdd"){
refreshTable();
//do the rest
}
}
}

class MainFrame extends JFrame{

public MainFrame(ActionListener mainFrameController){
JFrame frame = new JFrame("Students");
//setup layout
dialogOk.setName("dialogOk");
dialogOk.addActionListener(mainFrameController);
//do more layout things

}

Som du kan se så lader du en controller styre hvad der sker ved tryk på knapper, og så lader du det visuelle stå for sigselv. Det samme gør du med dialog, du kunne f.eks lave en metode i mainFrameController som hed showAddDialog, som så viste JDialog og satte de knapper op som skal bruges der.
Avatar billede mikkelbm Nybegynder
09. maj 2007 - 14:19 #12
Svar... Og hvis der ikke sendes data med, kan du sagtens bruge sse77's forslag. Jeg synes dog selv bedst om den anden metode.
Avatar billede sse77 Nybegynder
09. maj 2007 - 14:19 #13
Jeg tager forbehold for fejl, da det ikke f.eks ikke er nødvendigt at lave en JFrame instans i MainFrame når den extender :)
Avatar billede ladbye Nybegynder
09. maj 2007 - 14:42 #14
sse77 -> du kan oss smide et svar, da dit forslag også var en løsning på mit problem
Avatar billede sse77 Nybegynder
09. maj 2007 - 14:51 #15
svar smidt :)
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