[gelöst] repaint problem

Status
Nicht offen für weitere Antworten.

jperl

Mitglied
hi leute,

ich habe mir eine java gui gschrieben, die via Runtime.exec() ein von mir gschriebenes kommandozeilenprogramm aufruft.
jetzt soll die kommandozeile immer abgegrast werden und der ausgegebene text in der gui in einem logfeld erscheinen.
soweit so gut, leider repainted mir die gui mein logfeld so lange nicht, bis mein kommandozeilenprogramm beendet ist (2-3 min).

den aufruf des prozesses habe ich jetzt in eine klasse gepackt die thread extended. jedoch wird die gui immer noch erst am ende neu gezeichnet.
in frame.log() steht das repaint der jeweiligen komponente drin. das sysout in der konsole wird ausgegeben, es erfolgt jedoch kein repaint.

was mache ich falsch?
anbei der thread der den prozess abwickelt, sowie die actionperformed die den thread aufruft.

danke für eure hilfe.

jperl



Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class CLThread extends Thread
{
	public CLThread(String cmd, ACRLSFrame frame)
	{
		this.cmd = cmd;
		this.frame = frame;
	}
	
	
	public void run()
	{
		try
		{
			System.out.println(cmd);

			Runtime run = Runtime.getRuntime();
			Process pr = run.exec(cmd);

			BufferedReader buf = new BufferedReader(
					new InputStreamReader(pr.getInputStream()));
			String line = "";
			while ((line = buf.readLine()) != null)
			{
				System.out.println(line);
				frame.log(line, ACRLSFrame.LOG_NORMAL);
				frame.repaint();
			}

			pr.exitValue();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
		
	}
	
	private String cmd;
	private ACRLSFrame frame;
}

Code:
public void actionPerformed(ActionEvent arg0)
			{
				
				String cmd = "c:\\cygwin\\home\\jperl\\ACRLS\\bin\\acrls.exe c:\\input\\ c:\\output\\ 28 \""
					+ foveaX.getText()
					+ "\" \""
					+ foveaY.getText()
					+ "\" \""
					+ eyePanel.getEye()
					+ "\" \""
					+ patientID.getText()
					+ "\" \""
					+ scanID.getText()
					+ "\" \""
					+ df.format(examDate)
					+ "\" %d1001_os_sn6040 bmp %d bmp";

			CLThread pr = new CLThread(cmd, ACRLSFrame.this);
			pr.run();
			}
		}
 
Wir sollten "run()" nicht direkt aufrufen, sondern einfach den Thread starten:
Code:
pr.start()
Tipp: "JTextArea#append(..)" ist threadsafe und sollte den "repaint()" überflüssig machen:
Code:
   private JTextArea logArea = new JTextArea();
...
    public void log(String line, String logType) {
        logArea.append(logType+ " " + line + "\n");
    }
 
André Uhres hat gesagt.:
Wir sollten "run()" nicht direkt aufrufen, sondern einfach den Thread starten:
Code:
pr.start()

super danke.

das pr.run() war der fehler.
mit pr.start() klappt es wunderbar.

jperl
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben