GUI freeze

invoices

Mitglied
Hi,
bei mir friert irgendwie die GUI ein ohne eine Fehlermeldung.
Hab mal ein Minimalbeispiel dazu erstellt:

Java:
public class MainTest {
	  public static void main(String[] args) {
	        myGUI GUI = new myGUI(); //Erstelle die GUI
	  }
}

Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class myGUI{
	
	private Display d;
	
	public myGUI(){	
		createWindow();
	}

	private void createWindow(){
		JFrame frame= new JFrame("MYGUI");
		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		JPanel buttonPanel = new JPanel(new GridLayout(2,1));
	
		final JButton createButton = new JButton("Create Graph");
		buttonPanel.add(createButton);
		frame.getContentPane().add(buttonPanel);
		
		ActionListener createListener = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("OPEN");
				createGraph();
			}
		};
		createButton.addActionListener(createListener);
		
		frame.pack();
		frame.setVisible(true);

	}
	
	public void createGraph(){	
		Shell shell = new Shell();
		d=shell.getDisplay();
	
		shell.open();
		
		while (!shell.isDisposed()) {
			if (!d.readAndDispatch()) {
	           d.sleep();
	        }			
	    }
	}
	
}

Hat jemand eine Idee? Sind nur die zwei Klassen, die zusammenspielen.
 

Volvagia

Top Contributor
Darf man überhaupt Swing mit SWT mischen? Kenn mich da nicht aus. Aber du hast ne wunderschöne (vermutlich längere) Schleife. Wie soll der EDT (das JFrame) denn zeichnen, wenn du ihm die ganze Zeit aufhältst?
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Darf man überhaupt Swing mit SWT mischen?
Wenn nicht, dann nur aus "etischen" Gründen, ansonsten entscheiden Exceptions und andere Fehler, was man darf und was nicht.
Hier dürfte der Fehler an einem schlafenden Thread hängen. Egal wie gross die besagte Schleife ist, für mich sieht's eher danach aus, als würde der EDT auf die Freigabe eines Monitors warten, welche niemals eintritt.
 

Volvagia

Top Contributor
Na ja, Swing-GUIs außerhalb des EDT zu bearbeiten ist auch keine gute Idee, gibt aber meiner Erfahrung nach (sofern man es nicht extra versucht zu provozieren) auch nur sehr selten Probleme.
Meinte "lang" im Sinn von Zeit und nicht "Länge" (1. Dimension) bzw. Codezeilen-Anzahl. Selbst wenn die Shell irgendwann disposed ist in der Zwischenzeit kein neuzeichnen möglich.
Ist aber auch nicht so wichtig, wir vermuten ja beide den Fehler in dieser Codezeile.
 

invoices

Mitglied
und wie setze ich am besten dann mein vorhaben um? ich will mitm Knopdruck das ding starten :S
hab bisher leider 0 Erfahrung mit dem ganzen GUI-Zeug.

edit: ok hiermit gehts

Java:
public void createGraph(){
		new Thread() {
            public void run() {
            	Shell shell = new Shell();
        		d=shell.getDisplay();
        	
        		shell.open();
        		
        		while (!shell.isDisposed()) {
        			if (!d.readAndDispatch()) {
        	           d.sleep();
        	        }			
        	    }
                   
                
            }
        }.start();
	}
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Try this:

Java:
public void createGraph(){  
	new Thread("Shell-Controller") {
		public void run() {
			Shell shell = new Shell();
			d = shell.getDisplay();
			shell.open();
        
			while (!shell.isDisposed()) {
				if (!d.readAndDispatch()) {
					d.sleep();
				}
			}
			
			EventQueue.invokeLater(new Runnable() {
				public void run() {
					shellClosed();
				}
			});
		}
	}.start();
}
public void shellClosed() {

}

[EDIT]Mist, schon wieder zu langsam. >.<[/EDIT]
 

Ähnliche Java Themen


Oben