Hallo,
Ich möchte mir meine Output nicht nur auf der Konsole sondern noch zusätzlich auf einem JFrame mit einer JTextArea als ContentPane ausgeben lassen.
Jeder Output geht zuerst an eine Runnable 'OutputManager' die das Ganze dann auf Konsole ausgibt bzw. eben die Textarea überschreibt.
Dabei hab ich folgendes Problem:
Wenn ich das JFrame von Anfang an auf isVisible(true) setzte, sehe ich die mein JFrame (logisch) aber die ganzen "Einträge" Folgen erst wenn die Queue leer ist bzw. das Programm alles berechnet hat, und nicht wie die Konsoloe parallel. Kann ich das JFrame einer Runnable zuordnen, so dass es in der Lage ist zu reagieren wenn ich eine Componente überarbeite?
Der OutputManager:
Mein JFrame mit JTextArea ('ProcessInterface')
Ich möchte mir meine Output nicht nur auf der Konsole sondern noch zusätzlich auf einem JFrame mit einer JTextArea als ContentPane ausgeben lassen.
Jeder Output geht zuerst an eine Runnable 'OutputManager' die das Ganze dann auf Konsole ausgibt bzw. eben die Textarea überschreibt.
Dabei hab ich folgendes Problem:
Wenn ich das JFrame von Anfang an auf isVisible(true) setzte, sehe ich die mein JFrame (logisch) aber die ganzen "Einträge" Folgen erst wenn die Queue leer ist bzw. das Programm alles berechnet hat, und nicht wie die Konsoloe parallel. Kann ich das JFrame einer Runnable zuordnen, so dass es in der Lage ist zu reagieren wenn ich eine Componente überarbeite?
Der OutputManager:
Java:
package fractalator.main.output;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import fractalator.main.surface.ProcessInterface;
public class OutputManager implements Runnable {
private volatile boolean shutdown;
private BlockingQueue<String> queue = new ArrayBlockingQueue<String>(42);
public OutputManager(){
shutdown=false;
}
public void shutdown() {
shutdown = true;
}
public void print(String line) throws InterruptedException {
queue.put(line);
}
@Override
public void run() {
ProcessInterface PI = new ProcessInterface();
PI.setVisible(true);
while (shutdown == false) {
String line = queue.poll();
if (line!=null) {
if(line.equals("Calculating Mandelbrot ...")){
//PI.setVisible(true);
}
PI.textarea_console.append(line+"\n");
System.out.println(line);
if(line.equals("Finished Mandelbrot!")){
//PI.setVisible(false);
}
}
}
while (!queue.isEmpty()) {
try {
String line = queue.take();
System.out.println(line);
} catch (InterruptedException e) {
}
}
}
}
Mein JFrame mit JTextArea ('ProcessInterface')
Java:
package fractalator.main.surface;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class ProcessInterface extends JFrame {
private JPanel basePanel;
public JTextArea textarea_console;
public ProcessInterface(){
initializeGUI();
}
private void initializeGUI(){
/*
* Default Operations
*/
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
//setResizable(false);
setTitle("Fractalator - Console");
setSize(500,300);
/*
* Base Elements
*/
textarea_console = new JTextArea("");
textarea_console.setForeground(Color.GREEN);
textarea_console.setBackground(Color.BLACK);
textarea_console.setEditable(false);
setContentPane(textarea_console);
}
}