Pauza w pentli?

0

Mam coś takiego:

public void Rozlicz_zlecenie()
 {
  JLabel napis_serwisant=new JLabel("Serwisuje:");
  //----------------------------------------------------------------------------
  JPanel panel = new JPanel();
  napis_serwisant.setBounds(5,5,200,20);
  panel.add(napis_serwisant);
  JFrame okno = new JFrame("Rozlicz zlecenie");
  okno.setSize(500,300);
  okno.add(panel);
  panel.setLayout(null);                                             
  okno.setVisible(true);
  okno.setLocationRelativeTo(null);
 }

No i wywołanie:

for(int i=0;i<wielkosc_tabeli;i++)
    {
    Rozlicz_zlecenie();

    }

Proste, powstaje tyle okien ile ma wartość wielkość_tabeli. Problem w tym ze wszystkie powstają jednocześnie. Co jest zgodne z kodem. Pytanie:
Jak zrobić aby kolejne okno tworzyło się dopiero po zamknięciu poprzedniego. Albo lepiej po kliknięciu przycisku który mogę dodać. czy jest to możliwe?

0

najprościej:

public void Rozlicz_zlecenie()
 {


  zmienna = true;


  JLabel napis_serwisant=new JLabel("Serwisuje:");
  //----------------------------------------------------------------------------
  JPanel panel = new JPanel();
  napis_serwisant.setBounds(5,5,200,20);
  panel.add(napis_serwisant);
  JFrame okno = new JFrame("Rozlicz zlecenie");
  okno.setSize(500,300);
  okno.add(panel);
  panel.setLayout(null);                                             
  okno.setVisible(true);
  okno.setLocationRelativeTo(null);
  

  pauza(okno);


 }
void pauza(JFrame okno) {
  while (zmienna) {
    try {Thread.sleep(10);} catch (InterruptedException e) {}
  }
  okno.setVisible(false);
}

musisz jedynie dodać zmienną (globalną chociażby) 'zmienna' (wyżej: boolean), która na początku metody 'Rozlicz_zlecenie()' będzie zmieniać się na 'true', a w momencie naciśnięcia przycisku, czy czego chcesz, zmienisz ją na 'false'. Automatycznie skończy pętlę w metodzie 'pauza()' i uniewidoczni okno, i dopiero zacznie tworzyć następne.

0

Hyyyy zrobiłem tak jak napisałeś, ale nie działa. A na dodatek gdy tworzy się okno to jest tylko ramka reszta jest 'przezroczyta'. No i nie moznawylaczyc okna ;/ Moze cos namieszałem ;/

boolean zmienna;

 void pauza(JFrame okno) {
  while (zmienna) {
    try {Thread.sleep(10);} catch (InterruptedException e) {}
  }
  okno.setVisible(false);
}


public void Rozlicz_zlecenie()
 {
  zmienna = true;
  JLabel napis_serwisant=new JLabel("Serwisuje:");
  //----------------------------------------------------------------------------
  JPanel panel = new JPanel();
  //----------------------------------------------------------------------------
  napis_serwisant.setBounds(5,5,200,20);
  panel.add(napis_serwisant);
  //----------------------------------------------------------------------------
  JFrame okno = new JFrame("Rozlicz zlecenie");
  okno.setSize(500,300);
  okno.add(panel);
  panel.setLayout(null);                                                      
  okno.setVisible(true);
  okno.setLocationRelativeTo(null);
  pauza(okno);
 }

for(int i=0;i<wielkosc_tabeli;i++)
    {
    Rozlicz_zlecenie();  
    }
0

Obsłuż sygnał zamknięcia okna w którym uruchomisz następne okno, jeśli trzeba. Przykład:

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Program {
	private static final int MaxCount = 5;
	private static int count = 0;
	public static void main(String args[]) {
		RozliczZlecenie();
	}
	
	public static void RozliczZlecenie() {
		count++;
		JLabel napis_serwisant=new JLabel("Serwisuje:");
		JPanel panel = new JPanel();
		napis_serwisant.setBounds(5,5,200,20);
		panel.add(napis_serwisant);
		JFrame okno = new JFrame("Rozlicz zlecenie");
		okno.setSize(500,300);
		okno.add(panel);
		panel.setLayout(null);                                             
		okno.setVisible(true);
		okno.setLocationRelativeTo(null);
		okno.addWindowListener(new WindowListener() {
			@Override
			public void windowActivated(WindowEvent e) { }
			@Override
			public void windowClosed(WindowEvent e) { }
			@Override
			public void windowClosing(WindowEvent e) {
				if(count < MaxCount)
					RozliczZlecenie();
			}
			@Override
			public void windowDeactivated(WindowEvent e) { }
			@Override
			public void windowDeiconified(WindowEvent e) { }
			@Override
			public void windowIconified(WindowEvent e) { }
			@Override
			public void windowOpened(WindowEvent e) { }
		});
	 }
}
0

Jeszcze inaczej można.. może będzie dla Ciebie wygodniej, nie znam sposobu myślenia ;), poza tym jak już to napisałem to opublikuje ;], np.:

public class KlasaTworzacaOkna {
    static boolean zmienna=false; static int wielkosc_tabeli = 5;
    public static void main(String args[]) {
        int i=0;
        while (i<wielkosc_tabeli) {
            if (!zmienna) {
                i++; zmienna = true;
                new KlasaKonkretnegoOkna();
            } else try{Thread.sleep(10);}catch(Exception e){}
        }
        System.exit(0);
    }
}
import javax.swing.*;

public class KlasaKonkretnegoOkna extends JFrame {

    public KlasaKonkretnegoOkna() {
        initComponents();
    }

    void initComponents() {
        setTitle("Rozlicz zlecenie"); setSize(500,300);
        JPanel panel = new JPanel();
        JLabel napis_serwisant=new JLabel("Serwisuje:"); napis_serwisant.setBounds(5,5,200,20);
        panel.add(napis_serwisant); panel.setLayout(null);
        JButton jButton = new JButton(); jButton.setText("PRZYCISK"); jButton.setBounds(30,30,100,30);
        jButton.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonMouseClicked(evt);
            }
        });

        panel.add(jButton);
        add(panel);
        setLocationRelativeTo(null); setVisible(true);
    }

    void jButtonMouseClicked(java.awt.event.MouseEvent evt) {
        setVisible(false);
        KlasaTworzacaOkna.zmienna = false;
    }
}

W takim przypadku zamiast stosować metodę 'Rozlicz_zlecenie' powtarzaną 'wielkosc_tabeli' razy, robisz dwie osobne klasy: jedną, która jest oknem i drugą, która ją wywołuje odpowiednią ilość razy.

0

Z tego co widzę, to w tym oknie chcesz tylko pokazać jakiś napis. Do tego jest klasa JOptionPane i jej statyczna metoda showMessageDialog. Jak to jest za mało, to są inne metody. Ostatecznie można wyprowadzić własną klasę z JDialog. Sztuka polega na tym, żeby okno pokazać jako modalne. Wtedy program czeka na zamknięcie okna zanim pokaże następne.
Kod z metodą sleep jest zły, o czym się już przekonałeś, bo nic się w oknie nie wyrysowało. Nawet jak zadziała, to tak się tego nie robi.

0

No właśnie, chce zmalowac dużo więcej w tym oknie. Ten napis to tak dla testu ;)

0

No to właśnie potrzebny ci jest JDialog. Opis i przykłady jak używać są w tutku do javy: http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
Okienko trzeba pokazać jako modalne, to następne pokaże się po jego zamknięciu.

0

Mnie tylko zastanawia po co w ogóle chcesz dla każdego zlecenia otwierać osobne okno?
Jeżeli każde rozliczanie zlecenia opiera się na tych samych danych, to tworzysz jedno, jedyne okno do tego celu przeznaczone, a do niego odpowiednio wprowadzasz i z niego wyprowadzasz dane, w międzyczasie aktualizując po każdym rozliczeniu.
No chyba, że każde rozliczenie opiera się na zupełnie innym modelu danych, a tym samym na zupełnie innym okienku formularza - wtedy rzeczywiście tworzenie i zamykanie okienek ma uzasadnienie. Tyle, że kod, który podałeś niczego takiego nie sugeruje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1