Avatar billede mungojerrie Nybegynder
15. november 2004 - 11:26 Der er 2 kommentarer og
1 løsning

Lukning af GUI vindue, hvor vinduet popper op igen.

hej

har lidt problemer med at fange en close operation i min subklasse som arver fra en superklasse som jeg bruger til al min GUI.

Når jeg klikker på enten "cancel" knappen eller den indbyggede luk knap "krydset" i toppen af vinduet, så lukker vinduet og popper op igen. Dette kan gentage sig op til flere gange, hvor den så til sidst forbliver lukket. I kan se min sub klasse herunder samt min super klasse i bunden.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JScrollPane;

import dk.Request;
import dk.ModalContainer;
import dk.AddressArchive;
import dk.CustomerPerson;

public class PopupChooseCustomer extends ModalContainer {
   
    protected static CustomerTableModel popupTableModel;
    protected static PopupCustomerTable popupTable;
   
    protected void newData(Request r) {
        try { popupTableModel.fetchData(r); }
        catch(Exception e) {
            e.printStackTrace();
            // ¤ Mangler pæn fejlhåndtering
        }
        popupTable.resetSizes();
        popupTable.clearSelection();
        popupTable.scrollRectToVisible(new Rectangle(0, 0, 0, 0));
    }
   
    public PopupChooseCustomer(JFrame f){
        super(f, null, EvikaliSMS.language.getValue("C_CREATE_PANEL_TITLE"), EvikaliSMS.language.getValue("OK"), EvikaliSMS.language.getValue("CANCEL"));
        popupTableModel = new CustomerTableModel();
        popupTable = new PopupCustomerTable(popupTableModel);
        newData(new Request(AddressArchive.AddressArchive_CLASS,AddressArchive.GETCUSTOMER)); // Make default search
        popupTable.selectFirst();
        JScrollPane sp = new JScrollPane();
        sp.getViewport().setView(popupTable);
        getContentPane().add(sp, BorderLayout.CENTER);
        Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension dsize = getPreferredSize();
        setLocation((size.width - dsize.width) / 2, (size.height - dsize.height) / 2);
        setSize(new Dimension(480, 235));
        pack();
    }

    public boolean okActivated() {return true;}

    public boolean cancelActivated() {return true;}   
}


---------------------------super klasse---------------------


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ModalContainer extends JDialog {
   
    private JButton close;
    private JButton cancel;
   
    public ModalContainer(JFrame f, JComponent jc, String title) {
        this(f, jc, title, "OK", null);
    }
   
    public ModalContainer(JFrame f, JComponent jc, String title, String okStr, String cancelStr) {
        super(f, true);
        setResizable(false);
        setTitle(title);
        getContentPane().setLayout(new BorderLayout(0,0));
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        JPanel buttonPane = new JPanel(new FlowLayout());
        close = new JButton(okStr);
        buttonPane.add(close);
        if (cancelStr != null) {
            cancel = new JButton(cancelStr);
            buttonPane.add(cancel);
        }
        getContentPane().add(buttonPane, BorderLayout.SOUTH);
        close.addActionListener (
                new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        if (okActivated())setVisible(false);
                    }
                }
        );
        if (cancelStr != null) {
            cancel.addActionListener (
                    new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            if (cancelActivated())setVisible(false);
                        }
                    }
            );
        }
        if (jc != null) setComponent(jc);
        getRootPane().setDefaultButton(close);
    }
   
    public void setComponent(JComponent jc) {
        getContentPane().add(jc, BorderLayout.CENTER);
        pack();
        Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension dsize = getSize();
        setLocation((size.width - dsize.width)/2, (size.height - dsize.height)/2);
        setVisible(true);
    }
    public boolean okActivated() { return true; }
    public boolean cancelActivated() { return true; }
}
Avatar billede acw Nybegynder
24. november 2004 - 09:33 #1
skal du ikke bare ændre:

public ModalContainer(JFrame f, JComponent jc, String title, String okStr, String cancelStr) {.....

setDefaultCloseOperation(DISPOSE_ON_CLOSE);
...}
til

setDefaultCloseOperation(EXIT_ON_CLOSE);
Avatar billede mungojerrie Nybegynder
26. november 2004 - 11:29 #2
Nej, det var såmænd slet ikke noget med min modalcontainer klasse at gøre. Er ikke helt sikker på hvad årsagen er, men jeg rettede den ActionListener som jeg havde på klassen (ej vist før):

private ActionListener createActionListener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnNewCustomerPerson) {new SetupPopupCreate(null);return;}
        if (e.getSource() == btnChooseMembers){new SetupPopupChoose();return;}


som spørger på hvilken knap der bliver klikket på.

Det blev rettet til en actionlistener på hver knap i stedet for og så duede det....
Avatar billede mungojerrie Nybegynder
26. november 2004 - 11:30 #3
lukker......
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