JavaFX TextArea Updaten bevor Prozess gestartet wird

Nurox

Mitglied
Hallo zusammen,

ich arbeite derzeit an einer JavaFX Application und habe ein kleines Problem. Ich möchte einen Prozess starten und zuvor eine TextArea updaten, wenn ich das nun so mache startet er mir aber erst den Prozess und updatet dann, wenn er fertig ist die TextArea.

Also z.B. ich öffne einen FileChooser, dann wenn ich damit eine Datei wähle mache ich:

textArea.setText("Starte Prozess");
object.startRandomMethod;
textArea.appendText("Prozess beendet")

Wenn ich das so mache dann wird erst die Methode aufgerufen und danach die Texte gesetzt.

Wenn ich das ganze in einem neuen Thread ausführe funktioniert es wie gewollt, das einzige Problem ist nur, dann ist das Fenster nicht blockiert (also der main Thread von Java) und man könnte theoretisch immer wieder einen neuen Thread erstellen, was nicht sein soll.

Hier mal ohne Thread:

Java:
@FXML
public void updateData() {
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open Resource File");
    File selectedFile = fileChooser.showOpenDialog(stage);
    if (selectedFile != null) {

                DataLoader loader = new DataLoader();
                infoTextfield.appendText("Start updating... " + "\n" + "this might take a few                 minutes");
                loader.loadData(selectedFile.toString());
                infoTextfield.appendText("finished updating");
    }
}

Hier mal wie ich es mit dem Thread gemacht habe:

Java:
@FXML
public void updateData() {
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open Resource File");
    File selectedFile = fileChooser.showOpenDialog(stage);
    if (selectedFile != null) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                DataLoader loader = new DataLoader();
                infoTextfield.appendText("Start updating... " + "\n" + "this might take a few                 minutes");
                loader.loadData(selectedFile.toString());
                infoTextfield.appendText("finished updating");
            }
        }).start();
    }
}


Hat jemand eine Idee wie ich das lösen kann?
 
Zuletzt bearbeitet von einem Moderator:

Nurox

Mitglied
Hallo,

deaktiviere doch einfach die Anwendung so lange der Prozess läuft.

LG Dominic

Hi, die Idee hatte ich auch, hast du gerade ein Beispiel wie das am einfachsten geht? Ich müsste ja den Text setzen dann deaktivieren und den Prozess starten, am ende dann wieder aktivieren und den neuen Text setzen.


Und sorry ich hatte die Code-Tags nicht gefunden heute morgen ;)
 

domjos1994

Mitglied
Also ich würde den Textbereich, wenn da immer nur Informationen ausgegeben werden grundsätzlich deaktivieren oder nur lesbar machen. Dann kann dir da keiner mehr herumpfuschen.

Wie wird den der Prozess ausgelöst? Durch das Betätigen einer Schaltfläche?
Wenn ja deaktiviere doch einfach den Button und stell den Cursor als Wait-Cursor da.

LG Dominic
 

Neumi5694

Top Contributor
Hinweis: Wenn du auf ein Event reagierst, so wird die GUI erst dann neu gezeichnet, sobald alles, was im Eventhandler passiert, abgearbeitet wurde.
Code:
loader.loadData(selectedFile.toString());
muss also in einen eigenen Thread und sollte nach Beenden
Code:
infoTextfield.appendText("finished updating");
auslösen.
 

Nurox

Mitglied
Also das es in einen separaten Thread muss war mir klar ;)
Nun ich mache es nun so, dass ich einfach die Buttons disable wenn der Thread läuft und danach wieder aktiviere, so ist das erstmal ok. Danke
 

dzim

Top Contributor
Schau dir vielleicht mal noch die Service-Klasse aus dem JavaFX concurrency package an. Damit kann man diese Problemstellung gut erledigen.
Wie das etwa geht, habe ich schon einmal in dem folgenden Forum-Beitrag beschrieben

http://www.java-forum.org/thema/mei...erden-nicht-aktualisiert.172464/#post-1086826

Der für dich wichtige Teil ist der FXML-Controller. Er enthält eine innere Service-Klasse (das sollte natürlich produktiv vielleicht nicht mehr so sein ;)). Der Button-Hander des Controllers schaut, ob der Service schon/noch läuft und wenn nicht startet er den Service (erneut).

Hier noch mal die Kopie:

FXML
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<!--
    Do not edit this file it is generated by e(fx)clipse from ../src/application/ProgressTest.fxgraph
-->

<?import java.lang.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressBar?>
<?import javafx.scene.control.ProgressIndicator?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.GridPane?>

http://javafx.com/fxml" fx:controller="application.ProgressTestController" alignment="CENTER" vgap="5" hgap="5">

    <Label text="HD Drive" GridPane.columnIndex="0" GridPane.rowIndex="0"/>
    <TextField promptText="pick drive" disable="true" GridPane.columnIndex="1" GridPane.rowIndex="0" GridPane.columnSpan="2"/>
    <Button text="Select ..." disable="true" GridPane.columnIndex="3" GridPane.rowIndex="0"/>
    <Label text="Drive No." GridPane.columnIndex="0" GridPane.rowIndex="1"/>
    <TextField promptText="01" disable="true" GridPane.columnIndex="1" GridPane.rowIndex="1" GridPane.columnSpan="3"/>
    <Button text="Delete Archive" disable="true" GridPane.columnIndex="0" GridPane.rowIndex="2" GridPane.columnSpan="2" GridPane.halignment="LEFT"/>
    <Button fx:id="readButton" text="Start Reading" onAction="#handleReadButton" GridPane.columnIndex="2" GridPane.rowIndex="2" GridPane.columnSpan="2" GridPane.halignment="RIGHT"/>
    <ProgressBar fx:id="progressBar" GridPane.columnIndex="0" GridPane.rowIndex="3" GridPane.columnSpan="4">
        <maxWidth><Double fx:constant="MAX_VALUE" /></maxWidth>
        <GridPane.margin>
            <Insets top="10"/>
        </GridPane.margin>
    </ProgressBar>
    <ProgressIndicator fx:id="progressIndicator" GridPane.columnIndex="0" GridPane.rowIndex="4" GridPane.columnSpan="4">
        <GridPane.margin>
            <Insets top="10"/>
        </GridPane.margin>
    </ProgressIndicator>
</GridPane>

Controller
Java:
package application;

import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.value.ChangeListener;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressIndicator;

public class ProgressTestController {
  
    @FXML
    private Button readButton;
    @FXML
    private ProgressBar progressBar;
    @FXML
    private ProgressIndicator progressIndicator;
  
    private MyFancyService service = null;
  
    @FXML
    public void initialize() {
      
        progressBar.setProgress(0.0);
        progressIndicator.setProgress(0.0);
      
        service = new MyFancyService(100L);
        service.progressProperty().addListener((ChangeListener<Number>) (observable, oldValue, newValue) -> {
            progressBar.setProgress(newValue.doubleValue());
            progressIndicator.setProgress(newValue.doubleValue());
        });
    }
  
    @FXML
    public void handleReadButton(ActionEvent event) {
        if (service.isRunning()) {
            System.out.println("Already running. Nothing to do.");
        } else {
            service.reset();
            progressBar.setProgress(0.0);
            progressIndicator.setProgress(0.0);
            service.start();
        }
    }
  
    private static class MyFancyService extends Service<Long> {
      
        private LongProperty countTo = new SimpleLongProperty(0L);
        private LongProperty current = new SimpleLongProperty(0L);
      
        public MyFancyService(long countTo) {
            this.countTo.set(countTo);
        }
      
        @SuppressWarnings("unused")
        public LongProperty countToProperty() {
            return countTo;
        }
      
        @SuppressWarnings("unused")
        public LongProperty currentProperty() {
            return current;
        }
      
        @Override
        protected Task<Long> createTask() {
            return new Task<Long>() {
                @Override
                protected Long call() throws Exception {
                    current.set(0L);
                    try {
                        for (int i = 0; i <= countTo.get(); i++) {
                            if (isCancelled())
                                break;
                            current.set(i);
                            updateProgress(current.get(), countTo.get());
                            Thread.sleep(100);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return current.get();
                }
            };
        }
    }
}

Die Application-Klasse habe schon damals aus Gründen von zu geringen Nutzen weggelassen (nur Initialisierung des FXMLs und an eine Scene und die Stage hängen, am Ende).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X textarea updaten bevor eine Methode aufegerufen wird AWT, Swing, JavaFX & SWT 6
C Textarea kontinuerlich updaten AWT, Swing, JavaFX & SWT 3
L TextArea Zeichenabstand gleich machen AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
D Hohe Prozessorauslastung bei Ausgabe auf TextArea AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
Hatsi09 TextArea formattieren AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
E Eingabe von Zahlen in TextArea AWT, Swing, JavaFX & SWT 2
K JavaFX: TextArea updated nicht AWT, Swing, JavaFX & SWT 7
M JavaFX TextArea disabled - ScrollBar enabled AWT, Swing, JavaFX & SWT 3
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
MrSnake JavaFX TextArea updated nicht AWT, Swing, JavaFX & SWT 22
B Java FX FXML Textarea SceneBuilder als XML Editor AWT, Swing, JavaFX & SWT 1
T JavaFX System.out.println in TextArea AWT, Swing, JavaFX & SWT 15
F JavaFX JavaFX HTMLEditor-Eingabe in Textarea als HTML anzeigen AWT, Swing, JavaFX & SWT 2
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
E Swing Error icon in der TextArea AWT, Swing, JavaFX & SWT 1
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
thobren JavaFX Inhalte aus dynamischen vbox mit TextArea auslesen AWT, Swing, JavaFX & SWT 9
thobren Swing Im JPanel wird nur TextArea gelöscht AWT, Swing, JavaFX & SWT 13
J JavaFX TextArea dynamisch Icon im Background anzeigen AWT, Swing, JavaFX & SWT 2
M JavaFX TextArea einzelne Buchstaben färben AWT, Swing, JavaFX & SWT 3
M JavaFX TextArea richtig formatieren AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
S Die Rücktaste und Entfernen in einer Textarea blockieren AWT, Swing, JavaFX & SWT 3
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
E TextArea - Maximale Zeichenanzahl AWT, Swing, JavaFX & SWT 2
N Swing teilstring in textarea fett machen AWT, Swing, JavaFX & SWT 13
J Swing TextArea mit nicht-editierbarem Text AWT, Swing, JavaFX & SWT 7
W Vergleich zweier Strings und schreiben in Textarea AWT, Swing, JavaFX & SWT 12
R AWT TextArea schreibunfähig machen AWT, Swing, JavaFX & SWT 5
J Werkzeugleiste für TextArea? AWT, Swing, JavaFX & SWT 10
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
S Textarea und Enter AWT, Swing, JavaFX & SWT 5
El_Lobo Swing Swing TextArea und JTextField werden nicht aktualisiert AWT, Swing, JavaFX & SWT 2
R Textarea zeigt Text nicht an AWT, Swing, JavaFX & SWT 5
H TextArea zeigt kein Text an AWT, Swing, JavaFX & SWT 6
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
C TextArea Ausgabe immer ganz oben AWT, Swing, JavaFX & SWT 3
C Konsolenausgabe in TextArea ausgeben AWT, Swing, JavaFX & SWT 8
P Swing Methodenaufruf beeinflusst TextArea nicht. AWT, Swing, JavaFX & SWT 6
S TextArea ausgabe ohne JFrame zu implementieren AWT, Swing, JavaFX & SWT 2
M Swing Eine andere Klasse über Button starten und in TextArea ausgeben AWT, Swing, JavaFX & SWT 13
M Inhalt aus TextArea verarbeiten AWT, Swing, JavaFX & SWT 4
A Swing Text von System.out.printIn in eine TextArea übergen AWT, Swing, JavaFX & SWT 12
S Sobald ich TextArea mit Text fülle alles weg? AWT, Swing, JavaFX & SWT 5
P TextArea Größenänderung AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
H anderes font in textarea AWT, Swing, JavaFX & SWT 2
E Datei in TextArea anzeigen AWT, Swing, JavaFX & SWT 12
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5
H AWT TextArea, TextListener AWT, Swing, JavaFX & SWT 5
D Swing [BoxLayout] Nur TextArea und nicht TextField vergroessen AWT, Swing, JavaFX & SWT 2
W JTextArea/TextArea kriegt keinen Fokus AWT, Swing, JavaFX & SWT 6
A Strings an Textarea anderer Klasse append(en) AWT, Swing, JavaFX & SWT 12
U Problem mit dem TextArea.appen()- Befehl AWT, Swing, JavaFX & SWT 2
G Textarea zeigt Text erst am Schluss an AWT, Swing, JavaFX & SWT 2
W JTextArea vs TextArea AWT, Swing, JavaFX & SWT 3
K TextArea auf Scrollpane AWT, Swing, JavaFX & SWT 3
A Dateien in TextArea ausgeben AWT, Swing, JavaFX & SWT 6
G Textarea soll automatisch mitrollen AWT, Swing, JavaFX & SWT 2
G Feste Größe einer TextArea AWT, Swing, JavaFX & SWT 2
G Kontextmenü zum kkopieren in einer TextArea AWT, Swing, JavaFX & SWT 5
D GUI + TextArea + inhalt der wörter zählen AWT, Swing, JavaFX & SWT 4
V Hilfe :( bekomme textarea nicht versetzt AWT, Swing, JavaFX & SWT 2
M TextArea relativ zur Fenstergröße AWT, Swing, JavaFX & SWT 14
Y Zahlen aus einer Textarea auslesen AWT, Swing, JavaFX & SWT 2
V textarea Problem Positionierung AWT, Swing, JavaFX & SWT 2
G textarea.read funzt net in Jar-Datei AWT, Swing, JavaFX & SWT 7
K Center Text in TextArea AWT, Swing, JavaFX & SWT 8
ModellbahnerTT Ersatz für Textarea AWT, Swing, JavaFX & SWT 13
K Zeilen von TextArea auswählen AWT, Swing, JavaFX & SWT 3
C TextArea Problem :( TextArea über komplettem JFrame AWT, Swing, JavaFX & SWT 2
S Text in Textarea über empfangenen Socketstream anzeigen AWT, Swing, JavaFX & SWT 4
M Problem mit Layout wegen Textarea AWT, Swing, JavaFX & SWT 3
F Scrollpane scrollt immer zur TextArea AWT, Swing, JavaFX & SWT 8
F Graphics2D scale und Positionierung einer TextArea AWT, Swing, JavaFX & SWT 8
J TextArea unkontrollierbar AWT, Swing, JavaFX & SWT 4
G toString -> TextArea AWT, Swing, JavaFX & SWT 2
F Einlesen von text in textArea mittels for-schleife AWT, Swing, JavaFX & SWT 3
L TextArea AWT, Swing, JavaFX & SWT 6
G keyListener & textarea AWT, Swing, JavaFX & SWT 2
C Text in TextArea gestalten AWT, Swing, JavaFX & SWT 2
M Farben im TextArea AWT, Swing, JavaFX & SWT 5
N TextArea positionieren AWT, Swing, JavaFX & SWT 3
P TextArea zeilenumbruch AWT, Swing, JavaFX & SWT 7
André B. formatierung in TextArea AWT, Swing, JavaFX & SWT 7
D setCaretPosition, nicht-editierbare TextArea AWT, Swing, JavaFX & SWT 8
J TextArea begrenzen AWT, Swing, JavaFX & SWT 6
P [TextArea] Text Formatieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben