SWT - über Thread Composite erstellen und Anhängen

neverland

Mitglied
Hey,

ich habe ein Problem mit einer SWT Anwendung. Ich will über einen Thread Gui Elemente (Controls) in einem Composite erstellen und diese an meine Shell anhängen.

Verzichte ich auf die Composites und mache das ganze über eine Tabelle und TableItems funktioniert das prächtig.

Verwende ich Composites wird der entsprechende Code zwar aufgerufen, an der Shell ändert sich zumindest sichtbar garnichts.

Zur illustration, hier ein paar Zeilen:

Aufruf des Threads:
Java:
		Display display = new Display ();
				
		Shell shell = new Shell (display);
		shell.setText(title);
		shell.setSize (700, 500);
		shell.setLayout(new FillLayout(SWT.VERTICAL));
		
		
		getHeader(shell,display);
		WatchThread wt = new WatchThread(display,shell);
		wt.start();

		shell.open ();
		while (!shell.isDisposed ()) {
			if (!display.readAndDispatch ()) display.sleep ();
		}
		display.dispose ();

Code des Threads:
Java:
					String sql = "SELECT * FROM `"+cfg.getSQLCollTab()+"` WHERE 1";
					
					rs = stmt.executeQuery(sql);
														
					while(rs.next()){

						System.out.println("Result found");

						
						Runnable r = new Runnable() {
							
							@Override
							public void run() {
								//rs.getString("")
																
								System.out.println("Plaziere Composite" + shell_ref.toString());
								try {
									Composite c = new Composite(shell_ref, SWT.NONE);
									FillLayout fl = new FillLayout(SWT.HORIZONTAL);
								    c.setLayout(fl);
									InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/neverland/pixs/neuer_alarm_gross.png");
									Image image = new Image(display_ref,is);
									Label img = new Label (c,SWT.LEFT);
									img.setImage (image);
									img.pack ();
									
									String text = "Neues Ereignis";
									Label txt = new Label (c,SWT.LEFT);
									FontData data = txt.getFont().getFontData()[0];
									Font font = new Font(display_ref, data.getName(), 50, SWT.BOLD);
									txt.setFont(font);
									txt.setText(text);
									
									shell_ref.setModified(true);
									
								}catch (Exception e) {
									// TODO: handle exception
									e.printStackTrace();
								}
								
								System.out.println("Composite sollte Plaziert worden sein!");

							}
						};
						
						display_ref.asyncExec(r);
                                                sleep(5);
                               }

Ich komme leider nicht mehr weiter, und google hat mir auch nicht geholfen (zumindestens habe ich nichts hilfreiches gefunden)

Währe Toll wenn jemand hier mir auf die Sprünge helfen könnte.

Gruß
neverland
 
Schon mal was von schichten gehört ^^... Ist ja schrecklich alles in einer Klasse zu mischen...
Außerdem kannst du GUI Elemente nur im GUI Thread hinzufügen du bist im falschen Thread du dazu synchroniseren...
Versteh auch denn Sinn nicht warum du dass in einem neuen Thread machst?
 
Der Code Stammt aus 2 Klassen, Naja und das die Gui Elemente über einen eigenen Thread hinzugefügt werden hat was damit zu tun, das einer auf änderungen im Datenstamm lauscht und der andere das Userinterface ist. Oder stehe ich jetzt bei dem Schichten auf dem Schlauch.
Komischerweise kann ich GUI Elemente hinzufügen wenn ich ne Tabelle verwende.
 
Der Code Stammt aus 2 Klassen, Naja und das die Gui Elemente über einen eigenen Thread hinzugefügt werden hat was damit zu tun, das einer auf änderungen im Datenstamm lauscht und der andere das Userinterface ist. Oder stehe ich jetzt bei dem Schichten auf dem Schlauch.
Komischerweise kann ich GUI Elemente hinzufügen wenn ich ne Tabelle verwende.

Normal trennt man GUI Code und Logik...
Für das Lauschen gibt es das Observer Pattern...
 
In dem ich nen ScrollComposite und nen Composite verwende läßt sich das ganze auch aktuallisieren. Auch wenn das keine Trennung zwischen GUI und Logik bedeutet


Java:
		final ScrolledComposite sc = new ScrolledComposite(shell, SWT.V_SCROLL | SWT.BORDER | SWT.H_SCROLL );
		final Composite scrolledc = new Composite(sc, SWT.NONE);
		sc.setExpandHorizontal(true);
		sc.setExpandVertical(true);
		sc.setMinSize(650, 350);
		sc.setContent(scrolledc);
		scrolledc.setLayout(new RowLayout(SWT.VERTICAL));

	    new Thread() {
	        public void run() {
	      
	        	final ArrayList<Integer> shown =  new ArrayList<Integer>();
	        	while(!interrupted()){
	                try {
	
	                    Thread.sleep(500);
	
	                } catch (Throwable th) {
	                	th.printStackTrace();
	                }
	
	                display.syncExec(new Runnable() {
	
	                    public void run() {
	
	                        if (shell.isDisposed()) return;
	                        
	                        try{
	                        	stmt = con.createStatement();
	        				
	                        	String sql = "SELECT `ID` FROM `"+cfg.getSQLCollTab()+"` WHERE `Status`='XXX' AND `flagArchive`='no'";
	        			           	
	                        	ResultSet rs = stmt.executeQuery(sql);
	        					                        		                        	
	                        	while(rs.next()){
	                        	
	                        		int naID = rs.getInt("ID");
	                        	
	                        		if(! shown.contains(new Integer(naID))){
	                        		
	                        			add(scrolledc, new Alarm(naID));
		                        		shown.add(new Integer(naID));
	                        			scrolledc.setSize(scrolledc.computeSize(SWT.DEFAULT, SWT.DEFAULT));
	                        			scrolledc.layout();
	                        		}
	                        		
	                        	}
	                        }catch (SQLException e) {
	                        	e.printStackTrace();
							}catch (Exception e){
								e.printStackTrace();
							}
	
	                    }
	
	                });
	        	}
	        }
	    }
	    .start();
 
Warum legst du überhaupt einen neuen Thread an, wenn du eh alles im GUI Thread ausführst????
 

Neue Themen


Zurück
Oben