Automatisches ändern des Inhalts eines jTextAreas

Vitt3x

Grünschnabel
Hi an euch alle,

ich versuche es mal bei euch. Ich habe ein Problem, was mich zur Zeit verrückt macht. Und ich bin nach vielem Stöbern im Internet nicht eindeutig fündig geworden.

Ich habe quasi einen String der über eine Get-Methode mit Inhalt gefüttert wird. Anschließend soll dieser Inhalt automatisch in einem jTextArray angezeigt werden. Kein Button oder sonstiges Swing Element.
Java:
publicclass MF extends javax.swing.JFrameimplements int_mainframe {
protectedstaticString str_output =null;
private javax.swing.JTextArea jTextArea;

@Overridepublicvoid setStrOutput(String string){
str_output = string;
jTextArea.setText(str_output);
}

public MF(){
initComponents();
}

privatevoid initComponents(){
jTextArea =new javax.swing.JTextArea();
}

java.awt.EventQueue.invokeLater(newRunnable() {
@Overridepublicvoid run(){
new MF().setVisible(true);
}
});
}
Das Problem ist jedoch, dass jTextArea nicht aktualisert wird.
Ich bitte um Hilfe!!!
 
Zuletzt bearbeitet von einem Moderator:
Hi und Willkommen bei tutorials.de,

wird die Methode setStrOutput überhaupt nachweislich aufgerufen?

Und dein Code ist etwas durcheinander.... Indents/Einrückungen und fehlende Leerzeichen etc.
 
Hi tut mir leid wegen der Formatierung. Ich werde das am Morgen regeln. Der Setter wird ausgeführt und ich sehe im debugger aufjedenfall den übergebenen String. Somit steht dieser der Klasse zur Verfügung. Gute Nacht und danke für die Antwort!
 
Ich bin mir nicht sicher, aber ich denke ich kann meinen Post oben leider nicht editieren. Deswegen schreibe ich den Code hier neu auf.


public class MF extends javax.swing.JFrameimplements int_mainframe {
protectedstatic String str_output = null;
private javax.swing.JTextArea jTextArea;​

@Override
public void setStrOutput(String string) {
str_output = string;
jTextArea.setText(str_output);
}​

public MF() {
initComponents();
}​

private void initComponents() {
jTextArea = new javax.swing.JTextArea();
}


java.awt.EventQueue.invokeLater(newRunnable() {
@Overridepublicvoid run(){
new MF().setVisible(true);
}
});​
}

Hoffe der Code wird richtig dargestellt...​
 
Ich probier's einfach mal:

Die InvokeLater ist ja wahrscheinlich in einer anderen Klasse und soll nur aufzeigen wie die Klasse aufgerufen wird...

Als erstes hab ich das Interface int_mainframe nicht. daher kurz nachgebaut:
Java:
public interface int_mainframe{
    public void setStrOutput(String string);
}

Als nächstes MF
Java:
import javax.swing.JFrame;
import javax.swing.JTextArea;

public class MF extends JFrame implements int_mainframe {

    protected static String str_output = null;
    private javax.swing.JTextArea jTextArea;
    public MF() {
        initComponents();
    }
    private void initComponents() {
        jTextArea = new JTextArea(3,40);
        this.add(jTextArea);
    }
    @Override
    public void setStrOutput(String string) {
        str_output = string;
        jTextArea.setText(str_output);
        //jTextArea.append(string);
    } 
}

und eine kleine Main zum testen:
Java:
import javax.swing.JFrame;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run(){
                MF mainFrame = new MF();
                mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                mainFrame.pack();
                mainFrame.setVisible(true);
                mainFrame.setStrOutput("Dynamischer Inhalt");
            }
        });
    }

}

mit setStrOutput setzt du dynamisch den Inhalt der TextArea. möchtest du Text anhängen funktioniert dies über die append Methode.

Vielleicht hab ich auch nicht ganz das eigentliche Problem erfasst aber kannst gerne nachhaken.

Viele Grüße
Youza
 
Ich glaub ich hab noch was gefunden woran es liegen könnte probier den Aufruf in einem Thread auszulagern:

Caller:
Java:
import javax.swing.JFrame;

public class Caller implements Runnable{

    @Override
    public void run() {
        MF mainFrame = new MF();
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.pack();
        mainFrame.setVisible(true);
        mainFrame.setStrOutput("Dynamischer Inhalt");
        for (int i = 0; i < 10; i++) {
            mainFrame.setStrOutput("\n" + String.valueOf((long)(Math.random()*10000)));
            try {
                Thread.sleep((long)(Math.random()*10000));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
       
    }

}

Main:
Java:
public class Main {

    public static void main(String[] args) {
        Thread caller = new Thread(new Caller());
        caller.start();
    }

}

MF und das Interface bleiben gleich.
 
Danke für die Hilfe. Ich habs auch gleich ausprobiert. Ich denke durch
  1. public void run() {
  2. MF mainFrame = new MF();
  3. ...
  4. }
wird ein weiteres neues Swing Fenster erstellt. Leider ist auch da das jTextArea leer.
Sagt dir vielleicht ein SwingWorker etwas? Evtl. funktioniert es damit. Allerdings hab ich Schwierigkeiten den bei mir zu implementieren.
Vielleicht kannst du da helfen.

EDIT: Sorry es schreibt doch den String in das jTextArea. Aber leider ist es in einem neuen Fenster. Ich würde gerne das alte behalten und dieses lediglich aktualisieren wollen.
 
Zuletzt bearbeitet:
Hi Vitt3x,

hab dir hier mal ne kleine Demo mit SwingWorker geschrieben:
Java:
import java.awt.GridLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;

public class DynamicTextArea extends JPanel {

    /**
    * 
    */
    private static final long serialVersionUID = 1L;
    private JTextArea taskOutput;
    private Task task;
    public class Task extends SwingWorker<Void, Void> {
       
        public Task(){
           
        }
        /*
        * Main task. Executed in background thread.
        */
        @Override
        public Void doInBackground() {
            for (int i = 0; i < 10; i++) {       
                long wait = (long)(1000 * Math.random());
                try {
                    Thread.sleep(wait);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                taskOutput.append("gewartet für: " +  wait + "\n");
            }
            return null;
        }

        /*
        * Executed in event dispatching thread
        */
        @Override
        public void done() {
            taskOutput.append("Done!\n");
        }
    }

    public DynamicTextArea() {
        this.setLayout(new GridLayout());
        taskOutput = new JTextArea(10, 20);
        taskOutput.setMargin(new Insets(5, 5, 5, 5));
        taskOutput.setEditable(false);
        this.add(new JScrollPane(taskOutput));
        task = new Task();
       task.execute();

    }

    private static void createAndShowGUI() {
        // Create and set up the window.
        JFrame frame = new JFrame("Dynamic TextArea Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new DynamicTextArea());
        frame.pack();
        frame.setVisible(true);
       
    }
   

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
               
            }
        });
       
    }
}

Viele Grüße
Youza
 
HEUREKA!!! Ich habe die Lösung gefunden und auch umsetzen können:

Referenz: http://stackoverflow.com/questions/629315/dynamically-refresh-jtextarea-as-processing-occurs

Das ganze soll doch über einen Thread laufen.

Ich hatte es auch mal mit einem SwingWorker versucht und einen PropertyChangeListener für das jTextArea, aber es hat trotzdem nicht den Text in das JTextArea eingetragen. Mit einem gesonderten Thread in einer Unterklasse von MF, ging es aber dann. Dazu muss der Thread durch eine Aktion bzw. Listener aufgerufen werden. Ich habe noch eine Synchronisation eingebaut, die abwartet, bis str_output soweit ist und abgerufen werden kann. Mir fällt ein Stein vom Herzen haha.

Vielen Dank für dich Mühe!
 
Zurück