Avatar billede brianmp Nybegynder
14. januar 2003 - 19:48 Der er 16 kommentarer og
3 løsninger

Midlertidigt stop af program

Hej eksperter

Jeg har et mindre problem (et af mange :) i et lille program jeg er ved at lave.

Jeg har en MainGUI klasse (en JFrame) som indeholder en Jlist. Så har jeg en anden klasse VisRetGUI (en ny JFrame), hvori der kan indtastes nogle data.

Mit problem er at jeg gerne vil have at MainGUI venter til VisRetGUI bliver lukket, og derefter opdatere min JList.

Hvordan gør jeg dette?

B_M_P
Avatar billede arne_v Ekspert
14. januar 2003 - 20:15 #1
Det burde jo ikke være så svært, men hvis du viste lidt kode, så
var det nemmere at svare.
Avatar billede arne_v Ekspert
14. januar 2003 - 20:31 #2
Her er et absolute-do-nothing eksempel:

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

public class TwoFrame {

    public static void main(String[] args) {
        JFrame f1 = new JFrame();
        f1.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                JFrame f2 = new JFrame();
                f2.addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });
                f2.pack();
                f2.setVisible(true);
            }
        });
        f1.pack();
        f1.setVisible(true);
    }
}
Avatar billede carstenknudsen Nybegynder
14. januar 2003 - 20:40 #3
For at sikre dig at den ene JFrame låser skal
du bruge en modal frame. Det gør du f.eks. ved at
kalde en af de mange statiske metoder i
JOptionPane.
Avatar billede carstenknudsen Nybegynder
14. januar 2003 - 20:52 #4
Her er et eksempel der viser hvordan
man bruger JOptionPane. Bemærk at
knappen er inaktiv til du har foretaget
dit valg.
import javax.swing.*;
import java.awt.event.*;
public class ModalTest {
    public static void main(String[] args) {
    JFrame f1 = new JFrame();
    JCheckBox box = new JCheckBox("Check me!");
    f1.getContentPane().add(box);
    JFrame f2 = new JFrame();
    JButton button = new JButton("I'm inactive!");
    f2.getContentPane().add( button );
    f2.pack();
    f2.show();
    JOptionPane.showConfirmDialog(f2,f1.getContentPane(),"Check",JOptionPane.PLAIN_MESSAGE);
    }
}
Avatar billede brianmp Nybegynder
15. januar 2003 - 14:10 #5
I får lige lidt kode:

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

public class MainGUI extends JFrame
{
.
.
.
private class visRetAL implements ActionListener
{
    public void actionPerformed(ActionEvent e)
        {
            int i = dvdListe.getSelectedIndex();
           
            if (i != -1)
            {
                setEnabled(false);
                VisRetGUI visRetGUI = new VisRetGUI(gm, i);
               
                // Vent til visRetGUI bliver lukket?
               
                dvdListe.removeAll();
                dvdListe.setListData(opdaterListe());
                setEnabled(true);
            }
        }
    } //private class visAL implements ActionListener
}


Den anden klasse:

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

I får lige lidt kode:

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

public class MainGUI extends JFrame
{
.
.
.
private class visRetAL implements ActionListener
{
    public void actionPerformed(ActionEvent e)
        {
            int i = dvdListe.getSelectedIndex();
           
            if (i != -1)
            {
                setEnabled(false);
                VisRetGUI visRetGUI = new VisRetGUI(gm, i);
               
                // Vent til visRetGUI bliver lukket?
               
                dvdListe.removeAll();
                dvdListe.setListData(opdaterListe());
                setEnabled(true);
            }
        }
    } //private class visAL implements ActionListener
}


Den anden klasse:

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

class VisRetGUI extends JFrame
{
.
.
.
    private class lukAL implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // Fortælle MainGUI at den skal fortsætte?
            dispose();
        }
    } //private class lukAL implements ActionListener
}
Avatar billede brianmp Nybegynder
15. januar 2003 - 14:12 #6
Ups. Der gik vist et eller andet galt der. Prøver lige igen

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

public class MainGUI extends JFrame
{
.
.
.
private class visRetAL implements ActionListener
{
    public void actionPerformed(ActionEvent e)
        {
            int i = dvdListe.getSelectedIndex();
           
            if (i != -1)
            {
                setEnabled(false);
                VisRetGUI visRetGUI = new VisRetGUI(gm, i);
               
                // Vent til visRetGUI bliver lukket?
               
                dvdListe.removeAll();
                dvdListe.setListData(opdaterListe());
                setEnabled(true);
            }
        }
    } //private class visAL implements ActionListener
}


Den anden klasse:

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

class VisRetGUI extends JFrame
{
.
.
.
    private class lukAL implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // Fortælle MainGUI at den skal fortsætte?
            dispose();
        }
    } //private class lukAL implements ActionListener
}
Avatar billede brianmp Nybegynder
16. januar 2003 - 17:20 #7
Er der ingen der kan hjælp?
Avatar billede arne_v Ekspert
16. januar 2003 - 18:05 #8
[Jeg er en ren amatør til Swing, så sandsyneligvis vil Swing hajerne
grine deres røv i laser over dette forsalg]

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

public class MainGUI extends JFrame
{
  public boolean waitForOtherFrame = false; // <-----------
.
.
.
private class visRetAL implements ActionListener
{
    public void actionPerformed(ActionEvent e)
        {
            int i = dvdListe.getSelectedIndex();
         
            if (i != -1)
            {
                setEnabled(false);
                waitForOtherFrame = true; // <------------------
                VisRetGUI visRetGUI = new VisRetGUI(gm, i);
             
                while(waitForOtherFrame) { // <----------------
                    Thread.sleep(1000);
                }
             
                dvdListe.removeAll();
                dvdListe.setListData(opdaterListe());
                setEnabled(true);
            }
        }
    } //private class visAL implements ActionListener
}


Den anden klasse:

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

class VisRetGUI extends JFrame
{
.
.
.
    private class lukAL implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            somevariablecontainingmaingui.waitForOtherFrame = false;

            dispose();
        }
    } //private class lukAL implements ActionListener
}
Avatar billede brianmp Nybegynder
16. januar 2003 - 18:44 #9
Det virker ikke rigtigt. Programmet fryser.
Avatar billede arne_v Ekspert
16. januar 2003 - 18:54 #10
Hmmm.

Har du prøvet med lidt System.out.println i de 2 klasser og
set om problemet er at VisRetGUI aldrig kører p.g.a. sleep'en
eller waitForOtherFrame bare ikke biver sat ? ALtså: hvor
hænger den ?
Avatar billede brianmp Nybegynder
16. januar 2003 - 21:16 #11
VisRetGUI bliver startet, men der kommer ikke noget frem i JFramen. Jeg tror det er på grund af lykken at programmet fryser. Hvis ingen trykker på luk knappen, vil lykken jo kører uendeligt.

I øvrigt kan jeg heller ikke finde ud af at sætte somevariablecontainingmaingui (smukt navn :) til at referere til MainGUI.
Avatar billede arne_v Ekspert
16. januar 2003 - 21:23 #12
Hvis ikke du har den reference så vil løkken køre uendeligt.

Du laver en:
  private MainGui somevariablecontainingmaingui;
i VisRetGUI og tilføjer en MainGUI i argument-listen
til constructoren og sender så this med over fra
MainGUI.
Avatar billede arne_v Ekspert
16. januar 2003 - 21:26 #13
Men altså jeg gætter mig frem.

Jeg har ikke forstand på Swing.

Men dem der har står jo tilsyneladende ikke i kø for at
øse af deres visdom.
Avatar billede brianmp Nybegynder
16. januar 2003 - 21:38 #14
Den fryser stadig.

Jeg har tilføjet:
private MainGUI mGUI = this;
til MainGUI,

og:
private MainGUI mainGUI;
til VisRetGUI,

og tilføjet en MainGUI til constructoren.
Avatar billede arne_v Ekspert
16. januar 2003 - 21:40 #15
Hm. Så er jeg løbet tør for gode ideer.
Avatar billede brianmp Nybegynder
16. januar 2003 - 21:58 #16
Ok. Du skal da have mange tak for forsøget. Jeg lader spørgsmølet stå åbent i et stykke tid endnu, det kan jo være at der kommer nogen forbi der ved hvordan det skal gøres.
Avatar billede arne_v Ekspert
16. januar 2003 - 21:59 #17
Jeg kan ikke tro, at du er den først som har haft det problem.
Avatar billede brianmp Nybegynder
16. januar 2003 - 22:07 #18
Nej sikkert ikke. Jeg har ellers søgt i de andre spørgsmål, men jeg har ikke fundet noget. Prøver lige en gang til.
Avatar billede brianmp Nybegynder
18. januar 2003 - 19:23 #19
Jeg har selv fundet en løsning på problemet.

Jeg har lavet VisRetGUI om til en JDialog, og indsat linien "setModal(true);".

I får lige nogle points for forsøget.
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

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