Okno dialogowe

0

Od jakiegoś czasu próbuję wykonać w swojej aplikacji okno dialogowe, które pozwalałoby na wprowadzanie pewnych danych i przekazywanie ich do aplikacji. Musiałoby ono spełniać następujące warunki:

  • wywołane pojawia się na ekranie przesłaniając okno główne aplikacji
  • jakakolwiek próba kliknięcia na okno główne aplikacji powinna zakończyć się niepowodzeniem, okno główne nie powinno w żaden sposób reagować na kliknięcia itp aż do momentu kiedy okienko dialogowe zostanie zamknięte
  • po zminimalizowaniu aplikacji (np. 'pokaż pulpit') i jej przywróceniu pojawia się okno aplikacji a przed nim okienko dialogowe (nigdy nie może zostać przesłonione przez okno aplikacji)
  • kod aplikacji zostaje wstrzymany po otwarciu okna dialogowego i wznowiony po jego zamknięciu

I jak to wygląda obecnie u mnie... Na razie jest JFrame - aplikacja, klasa rozszerzająca JDialog - okienko dialogowe, wywoływana jako obiekt o nazwie 'creator'. Niestety tu się zaczynają wszystkie problemy, nie mogę zatrzymać kodu aplikacji ani stale 'utrzymać' okna dialogowego przed oknem aplikacji. Jeśli chodzi o zatrzymanie kodu - próbowałem wywołując w klasie głównej creator.wait(); , a w klasie odpowiedzialnej za okno dialogowe notifyAll();. Jednak klasa główna nie chce czekać i zwraca wyjątek IllegalMonitorStateException. Czego brakuje, żeby to działało? Co zrobić, żeby okno dialogowe zawsze znajdowało się przed oknem głównym? (tak jak np. w panelu sterowania windy przed oknem właściwości systemu znajduje się okno zmienne środowiskowe).

0

Witam!

Aby utworzyć JDialog o takich cechach jak piszesz wystarczy użyć konstruktora

 JDialog(Frame owner, String title, boolean modal) 

Parametr modal określa czy okno ma być modalne ( true) czy też nie (false)

Nie wiem jak wygląda twój kod ale zobacz na moim przykładzie ;-) :

import javax.swing.*;

public class MyFrame extends JFrame {
	MyFrame(){
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(400,400);
		setTitle("MyFrame");
		setVisible(true);

		// show dialog
		JDialog d = new JDialog(this, "JDialog ...", true );
		d.setDefaultCloseOperation(EXIT_ON_CLOSE);
		d.setSize(300, 300);
		d.show();
		
	}

	public static void main(String[] args){
		new MyFrame();	
	}
}

pzdr.

0

Dzięki za pomoc, to jednak wiem. btw. wygląda na to, że w JDialogu nie można wprowadzić EXIT_ON_CLOSE do setDefaultCloseOperation(...). Kompilowałeś to? Problemu narobiłem sobie pisząc klasę rozszerzającą JDialog, przez co nie miałem możliwości ustalenia ownera dla obiektu tej klasy, przez co JDialog zachowuje się jak osobne okno. A czy będę mógł przy pomocy klasy JDialog stworzyć okno dialogowe z 2 etykietami i polami, do których będę mógł wprowadzić dane, które następnie będę mógł w jakiś sposób przetransportować do klasy głównej aplikacji? ;) O to cały problem, że mam coś w rodzaju bazy i chcę żeby użytkownik chcąc do niej coś dodać klikał na przycisk na pasku menu po czym wprowadzał dane do nowo otwartego okna.

0

Wpakowałem wszystko w metode:

private void showDialog(){

		JDialog d = new JDialog(this, "MyDialog", true);
		d.setLayout(new GridLayout(3,2,4,4));

		lab1 = new JLabel("Value 1");
		lab2 = new JLabel("Value 2");

		text1 = new JTextField("", 20);
		text2 = new JTextField("", 20);

		ok = new JButton("Ok");
		cancel = new JButton("Cancel");

		d.add(lab1);
		d.add(lab2);
		d.add(text1);
		d.add(text2);
		d.add(ok);
		d.add(cancel);

		d.setSize(300,100);

		d.show();
	}

Ale okna nie da się zamknąć i nie można wprowadzać tekstu do JTextField :/
Z tym setDefaultCloseOperation(EXIT_ON_CLOSE) tamten kod kompiluje sie bez problemów.

a propoS przekazywania danych do aplikacji to raczej trzeba by było odziedziczyć nową klase z JDialog i tam dodać metodę zwracającą te dane. Pamiętaj żeby wywołać konstruktor ( ten co wspomniałem wcześniej ) z klasy nadrzędnej.

0
dawx napisał(a)

Z tym setDefaultCloseOperation(EXIT_ON_CLOSE) tamten kod kompiluje sie bez problemów.

NetBeans powiada:

Exception in thread "main" java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE
dawx napisał(a)

a propoS przekazywania danych do aplikacji to raczej trzeba by było odziedziczyć nową klase z JDialog i tam dodać metodę zwracającą te dane.

To już dawno mam zrobione...

dawx napisał(a)

Pamiętaj żeby wywołać konstruktor ( ten co wspomniałem wcześniej ) z klasy nadrzędnej.

A na tych zajęciach spałem ;P Czy to ma wyglądać mniej więcej tak?:

class KlasaDziedziczaca {
// [...]
KlasaDziedziczaca(Frame owner, String title, boolean modal) {
     super(owner, title, modal);
     // [...]
}
// [...]

//edit
Już działa ;) dzięki za pomoc

0

NetBeans powiada:
Exception in thread "main" java.lang.IllegalArgumentException: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE

U mnie miałem zły JVM i nie wyrzucało tego wyjątku :/</quote>

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