JWindow.setVisible(true) dauert ewig

Status
Nicht offen für weitere Antworten.

carbone

Mitglied
Moin,

also folgendes Problem:

Ich habe eine Anwendung(JWindow), die ,wenn man auf einen Button drückt, ein JDialog öffnet. Dieser JDialog hat rel viele JTabbedPanes mit vielen Componenten. Dann wird eine Konfigurationsdatei eingelesen und alle Componenten mit den Daten gefüllt. Die meisten Componenten sind globale Variablen

Bis der JDialog erscheint können schon mal 5 Sekunden vergehen. Das ist nicht akzeptabel!

Ich könnte den JDialog befüllen, während das Programm läuft und dann nur noch sichtbar machen. Will ich aber nicht unbedingt! Ich will verstehen warum das so lange dauert und was ich benutzen sollte um dies zu beschleunigen!?

Ich habe nun vorerst ein JWindow gemacht, das den Ladestatus anzeigen soll. Aber das wird garnicht erst sichtbar gemacht(das Fenster ansich schon, aber nicht die Komponenten, das JLabel etc..), bzw. erst wenn alles (JDialog) angezeigt wird.
Irgendwie wird die Anzeige der Komponenten(Lade-JWindow) geblockt bis alle Komponenten des JDialog initialisiert wurden.

Habe ich JAVA noch nicht verstanden? ich dachte die Methoden werden abgearbeitet kehren zurück und es geht mit der nächsten weiter.


Wäre für jden Tip dankbar!!

Gruß Carbone
 

Quaxli

Top Contributor
Bring ich mal den alten Joke: Mir ist am Wochenende meine Kristallkugel runter gefallen, daher kann ich Deinen Code leider nicht erahnen. ;)

Deine Frage kann ohne Code(ausschnitte) nicht beantwortet werden. Von Deiner Beschreibung her, vermute ich, daß etwas in Deinem Programm nicht paßt, aber ohne Beispiele kann ich nur diese globale Vermutung abgeben.
 

thE_29

Top Contributor
Jo, du hast Java definitiv nicht verstanden!

Der EDT (eventdispatcherThread) ist gleichzeitig der Thread der dir alles neu zeichnet!

Machst du also in einem Buttonklick oder sonstiger Action (wo der EDT aufgerufen wird) eine Arbeit die etwas blockiert (einlesen, etc..) dann kann er nicht neu zeichnen. (Logisch, weil wenn er mitn Arbeiten beschäftigt ist, arbeitet er und zeichnet er nicht).

Dh, du kannst hier entweder SwingWorker, Thread oder foxtrot (einfach mal suchen im Board) benutzen um wenigstens das Dialog Fenster oder einen JProgressBar anzuzeigen, das er gerade was lädt/macht, etc..

Da du eben beschrieben hast, dass du in dem JDialog viel machst (Datei einlesen, Komponenten erstellen) und ich auch nicht weiß wie sauber das von dir programmiert ist, braucht das halt ein bißchen Zeit (deine 5 Sekunden).
So nachdem er mit dem durch ist, kann dir der EDT auch wieder alles neu zeichnen!

Mit zB Thread könntest du das so machen! (wahrscheinlich sind bei dir die ganze Ladearbeiten im Konstruktor von dem anderen Dialog, das werden wir ausgliedern in die Methode loadData())

Code:
public void duHastButtonGeklicked()
{
final DeinDialog dlg = new DeinDialog();
new Thread(){
public void run()
{
dlg.loadData(); //jetzt wird der EDT nicht aufgehalten von den Ladearbeiten, da dies in einem separaten Thread gemacht wird
}
}.start();
dlg.setVisible(true); //anzeige sollte nun gleich stattfinden, da der EDT jetzt nur den Dialog anzeigt und nicht von den Leseoperationen aufgehalten wird
}

Mit foxtrot oder SwingWorker wäre das ganze schöner (mit foxtrot am schönsten, da man auch return Values hat, etc..)
 

carbone

Mitglied
Jep Danke, von foxtrott hab ich ich noch nichts gehört, werd mich mal belesen.

Und JA ich habe sehr unsauber programmiert! Das denk ich zumindest, da ich weder dem MVC (oder einem anderen Modll) nachgegangen bin noch irgendwelches Refactoring gemacht habe. Ich bin eben noch nicht so fit!

Ich werde es nun auch mit einem Thread lösen, nur ist es tatsächlich das Erstellen des JDialogs nicht das laden der Daten.

Für alle Leute deren Kristallkugel zerbrochen ist : Sourcecode
der SOurce ist jetz so, das der JDialog erstellt wird während das Hauptprogramm lädt. Das blockiert im Moment die GUI des Hauptprogramms bis alles geladen ist, dann wird wenn benötigt der Dialog nurnoch sichtbar gemacht.
Ist aber auch keine zufriedenstellende Lösung.
 
T

Tankwart

Gast
Hallo, ich habe ein ähnliches Problem mit JWindow und hoffe man kann mir weiter helfen.

Ich möchte mit JWindow ein kleines "Bitte warten"-Fenster erzeugen, das angezeigt wird während ein Algorythmus zum aufbauen des Inhaltes für einen JTree durchläuft.

zunächst mal der relevante Code:

Ich habe eine Klasse in der meine gesamte GUI erzeugt wird und der gesamte Programmablauf gesteuert wird.

Das JWindow habe ich als innere Klasse geschrieben:
Code:
class Statuswindow extends JWindow{
		
	private Container cp;
	private JLabel statuslabel;
	
	public Statuswindow() {
		this.cp = this.getContentPane();
		this.cp.setLayout(new FlowLayout());
		statuslabel = new JLabel("Darstellung wird erstellt. Bitte warten.", new ImageIcon("src/sanduhr.gif"), JLabel.CENTER);
		statuslabel.setPreferredSize(new Dimension(300,100));
		this.cp.add(statuslabel);
	}
}

Initialisiert wird es im Konstruktor der äußeren Klasse(diese heißt UIFrame):

Code:
public UIFrame(String[] dbargs) {
	super("CodeGrapher");
	cp = getContentPane();
	cp.setLayout(new BorderLayout());
	dbcargs = dbargs;
	db = new DBconn(dbcargs);
	blist = new Vector<String>();
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	setLPan();
	setRPan();
	setCPan();
	db.closeconn();
	sw = new Statuswindow();
	sw.setLocation(400, 300);
	sw.setSize(350, 150);
}

sw ist als private-Variable von UIFrame deklariert.

In der ActionPerformed von UIFrame will ich nun das JWindow er sichtbar und dann wieder unsichtbar machen.
Code:
public void actionPerformed(ActionEvent event) {
	String cmd = event.getActionCommand();
	Listitem ltemp;
	if(cmd.equals("Show")) {
		sw.setLocation(400, 300);
		sw.setSize(300, 100);*/
		sw.setVisible(true);
		ltemp = (Listitem) objektliste.getSelectedValue();
		int index = objektliste.getSelectedIndex();
		db = new DBconn(dbcargs);
		tc = new TreeCreator(db);
		baummod.setRoot(tc.buildbaum(ltemp.name, ltemp.status, ltemp.typ, blist));
		//sw.setVisible(false);  // <-- bewußt auskommentiert, zwecks testen
		get_ol_data();
		objektliste.setSelectedIndex(index);
		db.closeconn();
	}
/*
anderes Button-zeugs
*/		
}

In der Klasse DBconn realisiere ich meine Anbindung an eine Oracle-DB.
In der Klasse TreeCreator wird der Inhalt für den bereits erwähnten JTree generiert (jedoch nur die Knoten, der Tree selber wird in UIFrame erzeugt).

Nun zum Problem:
Das JWindow ist ab setVisible(true) da. Der Inhalt, also das Label mit dem Text und dem Icon wird aber erst sichtbar wenn die ActionPerformed schon durch ist. Wenn setVisible(false) nicht auskommentiert ist, bekomme ich es erst gar nicht zu sehen.

Muss ich das Statusfenster in einem eigenen Thread laufen lassen? Wenn ja, wie? (Habe noch keine Erfahrung mit Threads)
Und was blockiert hier die Erzeugung des Inhaltes von sw?
 
T

Tankwart

Gast
Hallo, ich habe ein ähnliches Problem mit JWindow und hoffe man kann mir weiter helfen.

Ich möchte mit JWindow ein kleines "Bitte warten"-Fenster erzeugen, das angezeigt wird während ein Algorythmus zum aufbauen des Inhaltes für einen JTree durchläuft.

zunächst mal der relevante Code:

Ich habe eine Klasse in der meine gesamte GUI erzeugt wird und der gesamte Programmablauf gesteuert wird.

Das JWindow habe ich als innere Klasse geschrieben:
Code:
class Statuswindow extends JWindow{
		
	private Container cp;
	private JLabel statuslabel;
	
	public Statuswindow() {
		this.cp = this.getContentPane();
		this.cp.setLayout(new FlowLayout());
		statuslabel = new JLabel("Darstellung wird erstellt. Bitte warten.", new ImageIcon("src/sanduhr.gif"), JLabel.CENTER);
		statuslabel.setPreferredSize(new Dimension(300,100));
		this.cp.add(statuslabel);
	}
}

Initialisiert wird es im Konstruktor der äußeren Klasse(diese heißt UIFrame):

Code:
public UIFrame(String[] dbargs) {
	super("CodeGrapher");
	cp = getContentPane();
	cp.setLayout(new BorderLayout());
	dbcargs = dbargs;
	db = new DBconn(dbcargs);
	blist = new Vector<String>();
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	blist.addElement("*zensier*");
	setLPan();
	setRPan();
	setCPan();
	db.closeconn();
	sw = new Statuswindow();
	sw.setLocation(400, 300);
	sw.setSize(350, 150);
}

sw ist als private-Variable von UIFrame deklariert.

In der ActionPerformed von UIFrame will ich nun das JWindow er sichtbar und dann wieder unsichtbar machen.
Code:
public void actionPerformed(ActionEvent event) {
	String cmd = event.getActionCommand();
	Listitem ltemp;
	if(cmd.equals("Show")) {
		sw.setLocation(400, 300);
		sw.setSize(300, 100);*/
		sw.setVisible(true);
		ltemp = (Listitem) objektliste.getSelectedValue();
		int index = objektliste.getSelectedIndex();
		db = new DBconn(dbcargs);
		tc = new TreeCreator(db);
		baummod.setRoot(tc.buildbaum(ltemp.name, ltemp.status, ltemp.typ, blist));
		//sw.setVisible(false);  // <-- bewußt auskommentiert, zwecks testen
		get_ol_data();
		objektliste.setSelectedIndex(index);
		db.closeconn();
	}
/*
anderes Button-zeugs
*/		
}

In der Klasse DBconn realisiere ich meine Anbindung an eine Oracle-DB.
In der Klasse TreeCreator wird der Inhalt für den bereits erwähnten JTree generiert (jedoch nur die Knoten, der Tree selber wird in UIFrame erzeugt).

Nun zum Problem:
Das JWindow ist ab setVisible(true) da. Der Inhalt, also das Label mit dem Text und dem Icon wird aber erst sichtbar wenn die ActionPerformed schon durch ist. Wenn setVisible(false) nicht auskommentiert ist, bekomme ich es erst gar nicht zu sehen.

Muss ich das Statusfenster in einem eigenen Thread laufen lassen? Wenn ja, wie? (Habe noch keine Erfahrung mit Threads)
Und was blockiert hier die Erzeugung des Inhaltes von sw?
 
T

Tankwart

Gast
Ich entschuldige mich für den Doppelpost, war keine Absicht.

Vielleicht könnte das ein Moderator in Ordnung bringen.
 

Tankwart

Mitglied
Hallo, ich habe das Problem jetzt doch selbstständig lösen können.

Ich lasse das erzeugen des Bauminhaltes jetzt von SwingWorker im Hintergrund ausführen.

Code:
if(cmd.equals("Show")) {
			sw = new Statuswindow();
			sw.setLocation(400, 300);
			sw.setSize(300, 100);
			sw.setVisible(true);
			showbutton.setEnabled(false);
			db = new DBconn(dbcargs);
			new TreeWorker().execute();
		}

Code:
	class TreeWorker extends SwingWorker<DefaultMutableTreeNode, Object> {

		@Override
		protected DefaultMutableTreeNode doInBackground() throws Exception {
			Listitem ltemp = (Listitem) objektliste.getSelectedValue();
			tc = new TreeCreator(db);
			DefaultMutableTreeNode ntemp = tc.buildbaum(ltemp.name, ltemp.status, ltemp.typ, blist);
			return ntemp;
		}
		
		protected void done() {
			try {
				baummod.setRoot(this.get());
			}
			catch (Exception e) {
				
			}
			finally {
				int index = objektliste.getSelectedIndex();
				get_ol_data();
				objektliste.setSelectedIndex(index);
				sw.setVisible(false);
				sw.dispose();
				showbutton.setEnabled(true);	
				db.closeconn();
			}
		}
	}

Das JWindow wird jetzt in der ActionPerformed erzeugt, statt im Konstruktor von UIFrame.
Ansonsten sollte alles wie vorher sein.

Vielleicht hilfts ja noch anderen.

Gruß Tankwart
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Messoras JWindow/Frame durch das man durchklicken kann AWT, Swing, JavaFX & SWT 5
V JWindow: Falsche Anzeige auf Ubuntu AWT, Swing, JavaFX & SWT 2
windl Overlay mit Transparentem JWindow und Canvas AWT, Swing, JavaFX & SWT 2
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
H Swing JTextField in JWindow, JWindow bekommt focus zurück? AWT, Swing, JavaFX & SWT 9
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
M Swing Semi-Transparenter Button (normal, mouseover) auf transparentem JWindow AWT, Swing, JavaFX & SWT 44
M Animiertes Gif auf JWindow AWT, Swing, JavaFX & SWT 10
GUI-Programmer Swing JWindow - Programm wird ohne Grund beendet AWT, Swing, JavaFX & SWT 3
GUI-Programmer JWindow zwischen den Desktopbild und Dektopverknüpfungen AWT, Swing, JavaFX & SWT 16
N JOptionPane als JWindow AWT, Swing, JavaFX & SWT 2
J Swing JWindow flackert trotz Doppelpufferung AWT, Swing, JavaFX & SWT 2
G Unterschiedliche Pfadangabe zu Icons zwischen JApplet und JWindow? AWT, Swing, JavaFX & SWT 2
E JWindow bewegen, minimieren, vergrößern und schließen AWT, Swing, JavaFX & SWT 5
H Swing JWindow flackert beim resizen AWT, Swing, JavaFX & SWT 6
M JWindow schließen wenn Frame sich ändert AWT, Swing, JavaFX & SWT 2
D JWindow rund machen AWT, Swing, JavaFX & SWT 11
hdi JWindow's mouseExited methode AWT, Swing, JavaFX & SWT 2
P JFrame/JWindow in der Mitte des Bildschirms positionieren AWT, Swing, JavaFX & SWT 4
R JWindow dockt nicht an JFrame bzw. nicht sichtbar ? AWT, Swing, JavaFX & SWT 6
M JWindow mit Rahmen(border) ausstatten AWT, Swing, JavaFX & SWT 4
G JFrame/JWindow AWT, Swing, JavaFX & SWT 2
H JWindow schließen bei einem Klick außerhalb der Anwendung? AWT, Swing, JavaFX & SWT 19
G JWindow Fensterhirachie beibringen AWT, Swing, JavaFX & SWT 14
R JWindow und JFrame AWT, Swing, JavaFX & SWT 3
S Bild auf JWindow platzieren AWT, Swing, JavaFX & SWT 4
L Probleme mit JTextField im JWindow AWT, Swing, JavaFX & SWT 4
F JWindow mit einem Bild und Transparenz AWT, Swing, JavaFX & SWT 4
L JWindow schliessen AWT, Swing, JavaFX & SWT 4
M jwindow --> jpanel --> jpanel --> textfeld nicht en AWT, Swing, JavaFX & SWT 3
D JWindow => transparent ? AWT, Swing, JavaFX & SWT 2
S JWindow zeichent Bild nicht AWT, Swing, JavaFX & SWT 2
K JWindow zerstören AWT, Swing, JavaFX & SWT 3
B KeyEvents und JWindow AWT, Swing, JavaFX & SWT 6
M Seltsame Exception bei setVisible(true) Methode in einem JFrame AWT, Swing, JavaFX & SWT 2
K Swing AWT-EventQueue-1 java.lang.NoClassDefFoundError bei setVisible(true) AWT, Swing, JavaFX & SWT 3
A Swing Buttons werden trotz setVisible nicht dargestellt AWT, Swing, JavaFX & SWT 14
S JFrame -> setVisible AWT, Swing, JavaFX & SWT 3
G Swing Setvisible problem AWT, Swing, JavaFX & SWT 1
1 Problem mit setVisible AWT, Swing, JavaFX & SWT 11
P jframe setVisible(false) wieder sichtbar machen? AWT, Swing, JavaFX & SWT 4
H Swing Keine Rückmeldung (freeze) bei setVisible(false) oder dispose() AWT, Swing, JavaFX & SWT 4
M Kein resize nach Component.setVisible() AWT, Swing, JavaFX & SWT 2
G Swing Wieso braucht man nach setVisible mal ein revalidate und mal nicht? AWT, Swing, JavaFX & SWT 8
B GlassPane setVisible(true) funktioniert nicht AWT, Swing, JavaFX & SWT 2
R Button soll nach dem er gedrückt wurde auf setVisible(false) gestellt werden. AWT, Swing, JavaFX & SWT 3
P Was tun HIDE_ON_CLOSE und setVisible() tatsächlich? AWT, Swing, JavaFX & SWT 7
V JTextField nimmt keine Eingaben an, nach nachträglichem setVisible des JWindows AWT, Swing, JavaFX & SWT 4
L Swing setVisible(false) bei GridBagLayout - wie Layoutverschiebung verhindern? AWT, Swing, JavaFX & SWT 2
L SWT Control.setVisible? AWT, Swing, JavaFX & SWT 2
hdi Swing Erstmaliges setVisible - Verständnisfrage AWT, Swing, JavaFX & SWT 5
M Swing JScrollPane und setVisible AWT, Swing, JavaFX & SWT 2
L mehere JPanels auf JFrame - setVisible() funktioniert nicht AWT, Swing, JavaFX & SWT 3
T setVisible()-Aufrufe werden zu spät umgesetzt AWT, Swing, JavaFX & SWT 6
L Problem mit "setVisible" unter LINUX AWT, Swing, JavaFX & SWT 5
K JDialog - Methode nach setVisible() aufrufen AWT, Swing, JavaFX & SWT 4
B alternative zu setVisible() AWT, Swing, JavaFX & SWT 2
F LayoutManager und Component.setVisible(boolean) AWT, Swing, JavaFX & SWT 2
E Hilfe - setVisible macht was es will AWT, Swing, JavaFX & SWT 7
R TextField bringt NullPointerException bei setVisible() AWT, Swing, JavaFX & SWT 12
S Ganze Fenster auf setVisible(false) setzen AWT, Swing, JavaFX & SWT 2
T Problem mit setVisible AWT, Swing, JavaFX & SWT 4
VPChief Ein JFrame ohne setUndecorated(true); nicht verschiebbar machen. AWT, Swing, JavaFX & SWT 6
L LookAndFeel JInternalFrame aussehen isSelected() true vs false AWT, Swing, JavaFX & SWT 0
D Swing JButton.setenabled(true) funktioniert nicht AWT, Swing, JavaFX & SWT 12
O Probleme bei setModal(true) AWT, Swing, JavaFX & SWT 8
J Swing setLineWrap(true) AWT, Swing, JavaFX & SWT 12
T Swing JTable - true zurückbekommen, wenn der Cursor in einer Zelle blinkt AWT, Swing, JavaFX & SWT 7
F JCombobox zwischen setEditable true und false switchen AWT, Swing, JavaFX & SWT 2
Developer_X Swing JFrame.setUndecorated(true); AWT, Swing, JavaFX & SWT 5
D JCombox editable true AWT, Swing, JavaFX & SWT 5
W setUndecorated(true) AWT, Swing, JavaFX & SWT 2
T FocusTraversalPolicy und setEditable(true) AWT, Swing, JavaFX & SWT 3
Z setUndecorated(true) <-> win 2000 <-> win xp AWT, Swing, JavaFX & SWT 13
L Checkbox in JTable (again), bei true Daten in Header AWT, Swing, JavaFX & SWT 7
F JComboBox setEditable( true ) auf Tastatur Events reagieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben