Avatar billede altinak Nybegynder
01. november 2005 - 12:59 Der er 11 kommentarer og
1 løsning

Dispose frame fra anden klasse

Jeg er i gang med at programmere et system til salg af varer. Efter en længere udvælgelsesprocess når man frem til en faktura. Herfra kan man enten vælge at udskrive fakturaen eller annullere. Hvis man trykker annuller popper et advarsels-vindue op og spørger om man ønsker at annullere (da dette vil annullere hele salget), med svarmulighederne "Ja" og "Nej".

Faktura ligger i én klasse, og advarsels-vinduet i en anden. Mit problem er, at jeg ikke ved, hvordan jeg kan forklare advarsels-vinduet, at hvis man trykker på "Ja", skal den dispose det bagvedliggende faktura-vindue. Nogen forslag, gerne med et lille eksempel til?
Avatar billede arne_v Ekspert
01. november 2005 - 13:03 #1
advarsels-vinduet skal vel have en reference til faktura-vinduet
Avatar billede mikkelbm Nybegynder
01. november 2005 - 13:08 #2
Hvis det er en custom dialog, så gør som Arne siger.

Ellers vil jeg bare bruge en optionpane inde fra dit fakturavindue. På den måde får du en returværdi tilbage og kan handle derudfra.

Lille eksempel:

int choice = JOptionPane.showConfirmDialog(null, "Dette vil annullere hele salget\nFortsæt?", "Annuller salg", JOptionPane.YES_NO_OPTION);

if (choice == JOptionPane.YES_OPTION)
{
    this.dispose();
}
else
  //... fortsæt arbejdet.


http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JOptionPane.html
Avatar billede altinak Nybegynder
01. november 2005 - 13:09 #3
Det er dét det skal. Jeg læste om et lignende problem, som du svarede på, og har i længere tid forsøgt at bruge det. Men jeg må erkende, at jeg blot er en lægmand udi Java-sprogets finere områder, så jeg får desværre brug for et mere uddybende ekspempel, hvis jeg skal kunne finde hoved og hale i det. :S
Avatar billede mikkelbm Nybegynder
01. november 2005 - 13:12 #4
Jeg prøver at lave et lidt mere uddybende eksempel.
Avatar billede altinak Nybegynder
01. november 2005 - 13:15 #5
Jeg takker. Har selv overvejet at ligge advarsels-vinduet i faktura-klassen, men da jeg også har andre problemer, hvor jeg skal setVisible(true/false) én klasse fra en anden klasse, tænkte jeg, at hvis jeg kunne få dette problem til at virke, ville jeg også kunne bruge det på de andre.
Avatar billede mikkelbm Nybegynder
01. november 2005 - 13:22 #6
Et lille hurtigt køreklart eksempel:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestOptionPane extends JFrame
{
    private JButton print = new JButton ("Print");
    private JButton cancel = new JButton ("Annuller");
   
    public TestOptionPane ()
    {
        setSize (400, 300);
       
        JPanel south = new JPanel();
        south.add(print);
        south.add(cancel);
       
        this.getContentPane().add(south, BorderLayout.SOUTH);
       
        print.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                print();
            }
        });
       
        cancel.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                cancel();
            }
        });
    }
   
    private void print ()
    {
        JOptionPane.showMessageDialog(TestOptionPane.this, "Printer nu faktura");   
    }
   
    private void cancel ()
    {
        int choice = JOptionPane.showConfirmDialog(TestOptionPane.this, "Dette vil annullere hele salget\nFortsæt?", "Annuller salg", JOptionPane.YES_NO_OPTION);

        if (choice == JOptionPane.YES_OPTION)
        {
            this.dispose();
        }
    }
   
    public static void main (String[] args)
    {
        new TestOptionPane().setVisible (true);
    }
}
Avatar billede altinak Nybegynder
01. november 2005 - 13:56 #7
Tak, Mikkel, for et dejligt, let-forståeligt eksempel. Det virker efter hensigten og er noget jeg sagtens kan bruge. Jeg takker for hjælpen. Hvis du lige smider et svar, er pointene dine.

Nu fik jeg jo så desværre ikke svar på, hvordan jeg fra én klasse kan setVisible(true/false) en anden klasse. Hvis du tilfældigvis skulle have et forslag liggende, ville jeg meget gerne høre det. :)
Avatar billede mikkelbm Nybegynder
01. november 2005 - 14:19 #8
Jeg har tilføjet lidt til det eksisterende eksempel:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestOptionPane extends JFrame
{
    private JButton print = new JButton ("Print");
    private JButton cancel = new JButton ("Annuller");
    private JButton showDialog = new JButton ("Vis");
    private JButton disposeDialog = new JButton ("Luk");
   
    private MyCustomDialog dialog = new MyCustomDialog();
   
    public TestOptionPane ()
    {
        setSize (400, 300);
       
        JPanel south = new JPanel();
        south.add(print);
        south.add(cancel);
        south.add(showDialog);
        south.add(disposeDialog);
       
        this.getContentPane().add(south, BorderLayout.SOUTH);
       
        print.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                print();
            }
        });
       
        cancel.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                cancel();
            }
        });
       
        showDialog.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                dialog.setVisible(true);
            }
        });
       
        disposeDialog.addActionListener(new ActionListener()
        {
            public void actionPerformed (ActionEvent e)
            {
                dialog.setVisible (false);
            }
        });
    }
   
    private void print ()
    {
        JOptionPane.showMessageDialog(TestOptionPane.this, "Printer nu faktura");   
    }
   
    private void cancel ()
    {
        int choice = JOptionPane.showConfirmDialog(TestOptionPane.this, "Dette vil annullere hele salget\nFortsæt?", "Annuller salg", JOptionPane.YES_NO_OPTION);

        if (choice == JOptionPane.YES_OPTION)
        {
            this.dispose();
        }
    }
   
    private class MyCustomDialog extends JDialog
    {
        public MyCustomDialog ()
        {
            setSize (200, 200);
            this.getContentPane().add(new JLabel("Hejsa"));
        }
    }
   
    public static void main (String[] args)
    {
        new TestOptionPane().setVisible (true);
    }
}


Håber det var det du mente. Ellers spørger du bare igen.
Avatar billede mikkelbm Nybegynder
01. november 2005 - 14:20 #9
I ovenstående eksempel har jeg bare en private class, men det kunne jo være hvilken som helst dialog/frame.
Avatar billede altinak Nybegynder
01. november 2005 - 15:42 #10
Jeg kan se idéen med dit eksempel, men mit system fungerer ikke helt således. Jeg har en salgsliste med alle de varer, jeg har valgt. Salgslisten ligger i en GUI-klasse kaldet Kontantsalg02. Endvidere har jeg en knap, "Fjern Vare", som åbner op for GUI-klassen Kontantsalg03, hvor man får vist salgslisten og dér har mulighed for at fjerne en vare. Kontantsalg02 kører nu i baggrunden. Hvis jeg så indtaster vare-ID for den vare, der skal fjernes, og trykker på knappen "Fjern Vare", genereres et nyt vindue for Kontantsalg02, hvor den fjernede vare ikke længere figurerer. Problemet er, at det gamle Kontantsalg02-vindue STADIG kører i baggrunden, hvilket jeg frygter vil være forvirrende for brugeren.

Hvad jeg håber kan lade sig gøre er, at når jeg trykker på "Fjern Vare" i Kontantsalg03, udføres der enten setVisible(false) eller dispose på det gamle Kontantsalg02, samtidig med at der oprettes en ny instans af Kontantsalg02 med de ønskede ændringer.

Noget af en snørklet forklaring, men jeg håber det gav mening, og at du har et forslag. Uanset hvad er pointene dine, og jeg takker mange gange for hjælpen.
Avatar billede mikkelbm Nybegynder
01. november 2005 - 16:07 #11
Det er svært at sige ud fra din beskrivelse der. Det kommer an på om det er én "dialog/frame" hvor du har dine knapper til at åbne/slette/osv... Eller om det ansvar ligger fordelt ud på de forskellige dialoger.

Hvis det er centralt ét sted, kan du gøre som i mit eksempel, ellers bliver du nødt til at smide referencer med rundt i dine dialoger - så de på den måde kan åbne og lukke hinanden.
Avatar billede altinak Nybegynder
02. november 2005 - 16:10 #12
Kan du give mig et eksempel på, hvordan jeg kan gøre dette - smide referencer med rundt i mine dialoger?
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