Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 21 von 21

Thema: Java Console in SWT Text Widget

  1. #16
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Du willst anscheinend echt alles vorgekaut. Und selbst wenn man dir Code in die Hand gibt, der schon genau das macht, was du möchtest, kommst du wieder und verstehst es nicht, weil du dich nicht damit auseinandergesetzt hast.

    Allein schon dein erster Post hätte dich eigentlich verraten sollen:

    ich brauche eine SWT Klasse, die nicht blockierend ist
    Das heißt eigentlich schon, du möchtest etwas, ohne etwas dafür zu tun.

    Ich hab dir aus meinen bisherigen Beispielen aber trotzdem mal schnell eine einzige Klasse, wie dus gern hättest, die genau das macht, was du möchtest, zusammenkopiert. Etwas, das jeder geschafft hätte, wenn er sich ein paar Stunden mit SWT (Java vorausgesetzt) beschäftigt hätte.

    Code:
    import java.io.OutputStream;
    import java.io.PrintStream;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.events.SelectionListener;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
    
    public class OutputWindow {
    
    	private static Display display = Display.getDefault();
    	private Shell sShell = null;
    
    	private Button button1 = null;
    	private Button button2 = null;
    
    	private Text text = null;
    	
    	public static void main(String[] args) {
    		OutputWindow thisClass = new OutputWindow();
    		thisClass.createSShell();
    		thisClass.sShell.open();
    
    		while (!thisClass.sShell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		display.dispose();
    	}
    
    	private void createSShell() {
    		sShell = new Shell();
    		button1 = new Button(sShell, SWT.PUSH);
    		button1.setText("Button 1");
    		button1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		button1.addSelectionListener(new SelectionListener() {
    			public void widgetSelected(SelectionEvent e) {
    				System.out.println("Button 1 pressed.");
    			}
    	
    			public void widgetDefaultSelected(SelectionEvent e) {
    			}
    		});
    		button2 = new Button(sShell, SWT.PUSH);
    		button2.setText("Button 2");
    		button2.addSelectionListener(new SelectionListener() {
    			public void widgetSelected(SelectionEvent e) {
    				System.out.println("Button 2 pressed.");
    			}
    	
    			public void widgetDefaultSelected(SelectionEvent e) {
    			}
    		});
    		button2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		text = new Text(sShell, SWT.MULTI|SWT.WRAP|SWT.V_SCROLL);
    		text.setEditable(false);
    		text.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
    		PrintStream p = new PrintStream( 
    				  new OutputStream() { 
    				    public void write( int b ) { 
    				    	text.append("" + (char)b ); 
    				    } 
    				  } 
    				);
    		System.setOut(p);
    		GridData gridDataText = new GridData(GridData.FILL_BOTH);
    		gridDataText.horizontalSpan = 2;
    		text.setLayoutData(gridDataText);
    		GridLayout gridLayout = new GridLayout();
    		sShell.setLayout(gridLayout);
    		gridLayout.numColumns = 2;
    	}
    }
    Es ist ein einfaches Fenster mit 2 Buttons, die das Fenster mit Text füllen, sobald sie gedrückt werden.

    Warum ich es trotzdem tue? Keine Ahnung, weil ich nett bin vielleicht. Aber diese Dreistigkeit, regt mich schon etwas auf.

    mfg, christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  2. #17
    Registrierter Benutzer
    Registriert seit
    22.06.2006
    Beiträge
    12
    Hallo Christian,
    vielleicht habe ich mich etwas falsch ausgedrückt. Aber ich möchte nicht dreist sein. Danke für deinen ausführlichen Beispielcode.

    Warum ich hier immer wieder schreibe ? Weil es nicht funktioniert. Dein Beispiel funktioniert. Das habe ich vorher auch schon gehabt. Aber mein Problem liegt woanders.

    Das SWT Fenster soll nur die Ausgabe eines anderen Threads liefern, der Berechnungen durchführt. Deshalb muss das SWT Fenster nebenläufig sein, ich habe es daher in einen Thread umgebaut.

    Alle System.out Ausgaben die innerhalb der SWT Fensterklasse geschrieben werden, landen wunschgemäß im SWT Fenster. Die wichtigen Ausgaben aus dem Hauptthread aber leider nicht.
    Das ist mein Problem mit dem ich nicht weiterkomme.

    Soll ich meinen jetzigen Stand posten ?

    gruß
    Jens

  3. #18
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Auch für diese Lösung wurde bereits der gesamte Code in diesem Thread gepostet. Hast du dir schon die mehrmals genannte Methode asyncExec angesehen?

    Wenn nicht hier der Code:

    Code:
    package at.sterzl.swt.examples;
    
    import java.io.OutputStream;
    import java.io.PrintStream;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.events.SelectionListener;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.swt.widgets.Text;
    
    public class OutputWindow {
    
    	public static Text text = null;
    	
    	public final static PrintStream p = new PrintStream( 
    			  new OutputStream() { 
    			    public void write( int b ) { 
    			    	if(text != null)
    			    		text.append("" + (char)b ); 
    			    } 
    			  } 
    			);
    	
    	static {
    		System.setOut(p);
    	}
    	
    	private static Display display = Display.getDefault();
    	private Shell sShell = null;
    
    	private Button button1 = null;
    	private Button button2 = null;
    
    	
    	
    	public static void main(String[] args) {
    		OutputWindow thisClass = new OutputWindow();
    		thisClass.createSShell();
    		new PrintThread(display, text).start();
    		thisClass.sShell.open();
    
    		while (!thisClass.sShell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		display.dispose();
    	}
    
    	private void createSShell() {
    		sShell = new Shell();
    		button1 = new Button(sShell, SWT.PUSH);
    		button1.setText("Button 1");
    		button1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		button1.addSelectionListener(new SelectionListener() {
    			public void widgetSelected(SelectionEvent e) {
    				System.out.println("Button 1 pressed.");
    			}
    	
    			public void widgetDefaultSelected(SelectionEvent e) {
    			}
    		});
    		button2 = new Button(sShell, SWT.PUSH);
    		button2.setText("Button 2");
    		button2.addSelectionListener(new SelectionListener() {
    			public void widgetSelected(SelectionEvent e) {
    				System.out.println("Button 2 pressed.");
    			}
    	
    			public void widgetDefaultSelected(SelectionEvent e) {
    			}
    		});
    		button2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		text = new Text(sShell, SWT.MULTI|SWT.WRAP|SWT.V_SCROLL);
    		text.setEditable(false);
    		text.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
    		GridData gridDataText = new GridData(GridData.FILL_BOTH);
    		gridDataText.horizontalSpan = 2;
    		text.setLayoutData(gridDataText);
    		GridLayout gridLayout = new GridLayout();
    		sShell.setLayout(gridLayout);
    		gridLayout.numColumns = 2;
    	}
    }
    
    class PrintThread extends Thread {
    	Text threadtext;
    	Display threaddisplay;
    	
    	public PrintThread(Display display, Text text) {
    		threaddisplay = display;
    		threadtext = text;
    	}
    	
    	public void run() {
    		while(true) {
    			if (!threaddisplay.isDisposed()) {
    				threaddisplay.asyncExec(new TextSetter("Threadausgabe"));
    			}
    			
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException ex) {
    				ex.printStackTrace();
    			}
    		}
    	}
    	
    	private class TextSetter extends Thread {
    
    		private String message = "";
    
    		TextSetter(String msg) {
    			message = msg;
    		}
    
    		public void run() {
    			if (!threadtext.isDisposed()) {
    				synchronized (threadtext) {
    					System.out.println(message);
    				}
    			}
    		}
    	}
    }
    mfg, Christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  4. #19
    Registrierter Benutzer
    Registriert seit
    22.06.2006
    Beiträge
    12
    Hallo Christian,
    deine Lösung geht davon aus, das der SWT Thread der Hauptthread ist, aus dem der Thread mit den Berechnungen gestartet wird.

    Ich möchte mein Hauptprogramm (wo die Dinge ablaufen) starten, und darin dann eine neue SWT Klasse erzeugen (die dann nebenläufig ist), die die Dinge ausgibt. Also genau anders herum. Ist das genauso möglich?

    Darin liegt mein Problem.

    gruß
    Jens

  5. #20
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Nicht einfach. Vor allem wenn man Funktionen hat, wie das Fenster beenden. Dann sollte auch das Programm beendet werden.

    Grundsätzlich geht es.

    Aber ich würde eher andersrum vorgehen. Du musst ja nur statt einer Klasse Textsetter eine andere Threadklasse in die Methode asyncExec einfügen, welche die Berechnungen durchführt, und danach trachten, dass der Zugriff auf das Outputwindow synchron abläuft.

    mfg, christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  6. #21
    Registrierter Benutzer
    Registriert seit
    22.06.2006
    Beiträge
    12
    Leider ist das Programm, an dem ich arbeite, schon soweit fortgeschritten, dass eine komplette Umstrukturierung nicht möglich ist. In Swing gibt es eine schöne Möglichkeit die auch super mit Threads funktioniert. In SWT ist das wegen der Event Schlfeife nicht so einfach.

    Deshalb wäre es halt schön, wenn man eine neue Klasse erzeugt, die nicht blockiert und sich um die Ausgabe kümmert.

    Kennt jemand eine Quelle,die sich explizit mit SWT und Threads auseinandersetzt?

    gruß
    Jens

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •