Parameter an Runnable-Objekt übergeben

videlius

Mitglied
Hallo,

Ich habe ein Problem. Ein Thread meiner Anwednung soll die Oberfläche meiner Anwendung verändern.
Soviel ich weiß, geht das ja nur, in dem ich der EventQueue ein Runnable Objekt übergebe, also etwa so.

Java:
public class myGui extends JFrame{

[...]

public void veraendereGui(String text)
{
            EventQueue.invokeAndWait(new Runnable() {
                @Override
           public void run() {
                // gib text in einer TextArea aus 
                }
            });
}

[...]

}

Das Problem ist nur, das ich den Parameter "text" nicht an das Runnable-Objekt übergeben bekomme.

Ich hab mir 2 Möglichkeiten überlegt das hinzubekommen, aber ich finde diese nicht praktikabel.

1. Eine Klassen-Variable myGuiText definieren und der den parameter text übergeben. Auf myGuiText kann das Runnable-Objekt zugreifen.
Allerdings finde ich hat diese Variable als Klassenvariable keine Berechtigung, da sie ja nur von dieser einen Methode verwendet wird.

2. Eine Innere Klasse definieren die Runnable implementiert.

z.b. so
Java:
    private class WriteText implements Runnable {

        String ausgabe;

        public WriteText(String text) {
            ausgabe = text;
        }

        @Override
        public void run() {
            // gib ausgabe in einer TextArea aus 
        }
    }

Da aber in anderem Zusammenhang noch mehr Sachen an Oberfläche verändert werden müssen (z.B. Buttons enablen/disablen) müsste ich jede Menge innere Klassen schreiben, die jeweils die run-Methode entsprechend überschreiben. Das kann es ja auch nicht sein.

Gibt es denn keine Möglichkeit nem Runnable-Object direkt nen Parameter mitzugeben?
 

eRaaaa

Top Contributor
Mhm? Du meinst dein Problem ist, dass du
Code:
text
nicht innerhalb von run benutzen kannst oder wie? Dann mach den Parameter doch einfach final :)
Java:
public void veraendereGui(final String text)
 

videlius

Mitglied
Hi,

hätte da noch eine zweite Frage. Ich will keinen neuen Thread deswegen aufmachen, da sich das Problem an meine erste Frage anschließt.

Nochmal kurze Zusammenfassung:


Ich trage ein Runnable-Objekt in die Event-queue meiner Oberfläche ein.
Dies soll eine jTextArea verändern, indem es einen String der im Parameter "text" steht in die jTextArea schreibt. Dank eRaaaa weiß ich ja nun das Text final sein muss. Danke! ;)

Java:
public void veraendereGui(final String text)
{
            EventQueue.invokeAndWait(new Runnable() {
                @Override
           public void run() {
                jTextArea.append(text + "\n");
                }
            });
}

Das blöde ist nur, dass kein Text in der jTextArea erscheint.
Ich kann aber sicher sagen, dass der appendBefehl erfolgreich ausgeführt wird, denn
ein
Java:
 System.out.println(jTextArea.getText());
nachdem append gibt mir den Inhalt von text korrekt auf der Konsole aus.
Das Problem scheint darin zu liegen, dass zwar die Komponente verändert, aber nicht neu gezeichnet wird.
Aus diesem Grunde hab ich ein
Java:
 jTextArea.repaint();
versucht, ohne Erfolg.

Woran könnte es liegen dass der Text nich auf die TextArea will?
 

eRaaaa

Top Contributor
So etwas ist so jetzt immer schwer zu sagen(von wo und wie wird denn veraendereGui aufgerufen etc.), kannst du mal ein Beispielcode (ausführbar) posten?

Aber an sich musst du, wenn du NUR append aufrufst, das nicht in ein invokeLater oder wait verpacken, da die Methode threadsicher ist!
D.h. es würde auch schon so etwas
Java:
public void veraendereGui(String text)
{
                jTextArea.append(text + "\n");
}
ausreichen
 

videlius

Mitglied
Ich müsste fast die komplette Anwendung posten, da eine Vielzahl von Klassen beteilligt sind.

Deshalb hab ich versucht nur die nötigsten Strukturen, in einer externen Andwendung darzustellen und das Problem so zu reproduzieren. Ich sags gleich, ohne Erfolg! ;(

Hier die Anwendung

Klasse: MyGui (Oberfläche mit main)

Java:
package javaapplication9;

import java.awt.EventQueue;
import java.util.Observable;
import java.util.Observer;

public class MyGui extends javax.swing.JFrame implements Observer{

    /** Creates new form myGui */
    public MyGui() {
        initComponents();
        new Backend(this);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jTextArea = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTextArea.setColumns(20);
        jTextArea.setEditable(false);
        jTextArea.setRows(5);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(0, 65, Short.MAX_VALUE)
                .addComponent(jTextArea, javax.swing.GroupLayout.PREFERRED_SIZE, 269, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 66, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(0, 61, Short.MAX_VALUE)
                .addComponent(jTextArea, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 62, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    public static void main(String args[]) {
        new MyGui().setVisible(true);
    }
    // Variables declaration - do not modify
    private javax.swing.JTextArea jTextArea;
    // End of variables declaration

    public void veraendereGui(final String text) {
        try {
            EventQueue.invokeAndWait(new Runnable() {

                @Override
                public void run() {
                    jTextArea.append(text + '\n');
                }
            });
        } catch (Exception ex) {
        }
    }

    public void update(Observable o, Object arg) {
       veraendereGui((String) arg);
    }
}

und die Klasse Backend, die sozusagen den Rest meiner Anwendung simulieren soll.

Java:
import java.util.Observable;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Backend extends Observable{

    private MyGui gui;
    private BlockingQueue<String> messages = new LinkedBlockingQueue<String>();

    public Backend(MyGui gui) {
        this.gui = gui;
        addObserver(gui);
        messages.add("Erste Nachricht");
        messages.add("Zweite Nachricht");
        messages.add("Dritte Nachricht");
        messages.add("Vierte Nachricht");
        Thread t = new Thread(new externerThread());

        t.setName("extThread");
        t.start();
    }

    private class externerThread extends Thread {

        @Override
        public void run() {
            while (!interrupted()) {
                try {
                    Thread.sleep(1000);
                    String msg = messages.take();
                    setChanged();
                    notifyObservers(msg);
                } catch (Exception ex) {
                }
            }
        }
    }
}


Das blöde ist, Sie funktioniert bestens und das Problem, dass der Text nicht auf der Textarea erscheint bekomme ich hier nicht simuliert. ???:L :bahnhof:

Somit werde ich wohl weiter in den Untiefen meiner Anwendung nach dem Problem suchen müssen.
Ich werde mal schreiben wenn ich den Wurm gefunden habe.

Trotzdem vielen Dank erstmal!
 

videlius

Mitglied
Nur der Vollständigkeit halber, ich hab den Fehler gefunden.


Ich hatte einen Fehler in der Implementation des Observer-Patterns.

kurze Erläuterung:

Die Klasse MyGui ist ein Observer

Java:
public class MyGui extends javax.swing.JFrame implements Observer{...}

Die Klasse Backend ist vom Typ Observable

Java:
public class Backend extends Observable{...}

und meldet sich beim Observer von MyGui an:

Java:
...
addObserver(gui);
...

Hier lag mein Fehler in der richtigen Anwendung habe ich das gemacht:

Java:
...
MyGui gui = new MyGui();
addObserver(gui);
...

mit anderen Worten, ich habe eine zweite Gui angelegt, die nicht Visible war und an diese hat das Observable seine Nachrichten geschickt.
Der Code war ansonsten in Ordnung.

Tja, kleiner Fehler große Wirkung und stundenlanges Suchen. Naja jetzt gehts wenigstens.

Vielen Dank nochmal für die Hilfe. :toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX Ein Parameter von einem Stage(GUI) zu einem anderen übergeben AWT, Swing, JavaFX & SWT 6
S Parameter ändern in try/catch AWT, Swing, JavaFX & SWT 5
A Swing JLabel als Parameter übergeben AWT, Swing, JavaFX & SWT 9
S JTextField parameter unveränderlich AWT, Swing, JavaFX & SWT 9
D JavaFX Interface Initializable - Was machen die Parameter in der Methode inizializeable() ? AWT, Swing, JavaFX & SWT 4
M JavaFX Parameter für Custom Control in FXML übergeben? AWT, Swing, JavaFX & SWT 4
A Swing Parameter werden bei Funktionsaufruf nicht ausgegeben AWT, Swing, JavaFX & SWT 2
M Swing Jtable CellRenderer Parameter uebergeben AWT, Swing, JavaFX & SWT 4
B Java-Applet Parameter übergabe? AWT, Swing, JavaFX & SWT 2
M Swing JButton-Konstruktor Icon-Parameter (Verständnisfrage) AWT, Swing, JavaFX & SWT 7
Furtano AWT setRGB() RGB-Parameter umwandeln? AWT, Swing, JavaFX & SWT 10
W SWT Übergabe Parameter wie in SWT mit "|" AWT, Swing, JavaFX & SWT 5
B Anonymer Klass Parameter übergeben AWT, Swing, JavaFX & SWT 3
A Beschreibung Parameter FormLayout AWT, Swing, JavaFX & SWT 8
M Checkboxen Namen setzten über Parameter => Abfragen? AWT, Swing, JavaFX & SWT 2
N JTable als parameter übergeben AWT, Swing, JavaFX & SWT 4
martinyyyy AWT Parameter erzeugen NullpointerException obwohl sie vorhanden sind? AWT, Swing, JavaFX & SWT 4
Semox Setzen des Layout Managers mittels Override Parameter AWT, Swing, JavaFX & SWT 10
Daniel_L Swing-Komponenten als Parameter an eine Klasse übergeben? AWT, Swing, JavaFX & SWT 4
C Parameter von GUI an Klasse übergeben. AWT, Swing, JavaFX & SWT 2
C Parameter übergeben in Eclipse AWT, Swing, JavaFX & SWT 3
F MouseMotionListener und Parameter? AWT, Swing, JavaFX & SWT 4
F Wie gebe ich Parameter zwischen Actions weiter? AWT, Swing, JavaFX & SWT 2
F Parameter aus HTML-Form in Java-App per Post an PHP Script s AWT, Swing, JavaFX & SWT 2
M Parameter übergeben AWT, Swing, JavaFX & SWT 13
L Wie Layout-Parameter ohne add angeben? AWT, Swing, JavaFX & SWT 2
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
Rubberduck JavaFX Runnable jar file doesn't work AWT, Swing, JavaFX & SWT 2
Joker4632 JFrame in eine Runnable auslagern? AWT, Swing, JavaFX & SWT 4
T JavaFX Button als Runnable AWT, Swing, JavaFX & SWT 4
E JLabel aus Runnable ändern AWT, Swing, JavaFX & SWT 2
X Runnable .Jar tut nichts AWT, Swing, JavaFX & SWT 3
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
A Swing Bild in runnable jar einfügen AWT, Swing, JavaFX & SWT 25
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
P KeyListener implements Runnable AWT, Swing, JavaFX & SWT 10
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
B mit maus Objekt bewegen AWT, Swing, JavaFX & SWT 3
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
U Was genau ist ein Shape-Objekt? AWT, Swing, JavaFX & SWT 3
DonBronson Objekt bewegen (Mausposition) AWT, Swing, JavaFX & SWT 3
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
U Was ist ein Shape, also klar ein Objekt, aber was ist damit gemeint (Graphics2d)? Und was sidn affinetransformationen AWT, Swing, JavaFX & SWT 1
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
M Swing Objekt Array in GUI ausgeben AWT, Swing, JavaFX & SWT 1
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
F Java FX Von der Fxml Datei zum Objekt AWT, Swing, JavaFX & SWT 8
M Swing Durch Usereingabe neues Objekt AWT, Swing, JavaFX & SWT 2
K Color-Objekt erzeugen in CMYK AWT, Swing, JavaFX & SWT 2
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
J gezeichnetes Objekt anklicken AWT, Swing, JavaFX & SWT 10
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L JavaFX als eigenes Objekt AWT, Swing, JavaFX & SWT 3
M [JavaFX] Objekt um Zentrum rotieren (Camera) AWT, Swing, JavaFX & SWT 1
E JavaFx Screne mehr als ein "Objekt" zuordnen ? AWT, Swing, JavaFX & SWT 2
F 2D-Grafik Objekt durch Einwirkung einer Kraft im Raum bewegen AWT, Swing, JavaFX & SWT 14
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
P Event Handling Anfängerfrage: ActionEvent bekommt kein Zugriff auf Objekt AWT, Swing, JavaFX & SWT 3
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
A AWT TTF-Datei zu Font-Objekt finden? AWT, Swing, JavaFX & SWT 5
S Objekt durch Tasteneingabe mehrmals drehen AWT, Swing, JavaFX & SWT 9
E Swing Objekt zu Position (Point) bewegen AWT, Swing, JavaFX & SWT 2
T 3D-Grafik (Java3D) Aus einem Objekt einer Szene (Würfel, Ebene) die wichtigen Randkoordinaten auslesen AWT, Swing, JavaFX & SWT 3
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
V Persistentes Objekt laden Progressbar AWT, Swing, JavaFX & SWT 7
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
propra Schnittpunkt zwischen Objekt und Kante finden AWT, Swing, JavaFX & SWT 24
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
S Objekt einmal laden zweimal anzeigen 3d AWT, Swing, JavaFX & SWT 6
I Swing Zugriff auf ein Objekt AWT, Swing, JavaFX & SWT 2
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
R Möglichkeiten ein abgeleitetes Objekt zu erzeugen AWT, Swing, JavaFX & SWT 4
P Swing Wie bekomme ich eine Referenz auf ein Objekt das im EDT erzeugt wird? Und anderes... AWT, Swing, JavaFX & SWT 8
T Objekt in Kreisbahn bewegen AWT, Swing, JavaFX & SWT 5
B Zeichnen von Bildern auf JPanel aus eigenem Objekt AWT, Swing, JavaFX & SWT 19
Dit_ Objekt mit ActionEvent übergeben AWT, Swing, JavaFX & SWT 2
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
L Swing Auf unabhängiges Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 8
A SWT SWT - Unbekannte Fläche (Objekt) erscheint im Composite AWT, Swing, JavaFX & SWT 6
D Objekt mit Button erstellen und mit anderem Button verwenden AWT, Swing, JavaFX & SWT 4
P Objekt kopieren AWT, Swing, JavaFX & SWT 2
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
U [MVC] Objekt bearbeiten AWT, Swing, JavaFX & SWT 9
O Swing JTable Colum Objekt AWT, Swing, JavaFX & SWT 6
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
M Objekt im ActionListener ansprechen AWT, Swing, JavaFX & SWT 3
C Wie komme ich an ein Objekt aus einem JTree? AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben