JFrame in eine Runnable auslagern?

Joker4632

Mitglied
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:
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);
       
    }


}
 
Nein du must es genau anders herum machen. Das JFrame bleibt der Main-Thread und die Berechnung wird zu einem Thread (runable). Schau Dir dafür am besten mal Swingworker an.

Gruß

Claus
 
Naja gut genau anders herum geht garnicht da mein OutputManger ein Thread bleiben muss, weil die Berechnung per Multithreading Laufen soll ... in Zukunft. Das könnte ich das Problem sein. Werden alle JFrames und co vom Main übernommen auch wenn ich sie wir von einem anderen Thread aus aufrufe?

Swingworker klingt schonmal passend ... ich bin nur verwirrt ist swing nicht eigentlich ja GUI? also genau mein JFrame und co? Wenn er dann aber meine Berechnungen macht finde ich den Begriff unpassend gewählt 😀
Ich versuchs dann einfach erstmal damit meine Berechnungen in eine Runnable umzuwandel/ in mehrere, dann hat die der Main schonmal nichtmehr am Hut.
 

Neue Themen


Zurück
Oben