Auf Thema antworten

Hallo,


ich habe nach viel suchen und lesen folgendes implementiert, und es sieht auch schon besser aus als vorher, sprich ich bekomme keine Exception mehr .. dennoch scheint es noch nicht die 100% richtige Lösung zu sein.


Hier mein Code:


1. Das Model mit ein paar Methoden die nur ein bisschen rechnen aber keinerlei FX Komponenten enthalten.


[code=Java]package application;


import java.util.Random;


public class Model {


    // Methods


    public int countNumber(int startValue, int maxValue) {

        int result = startValue;

        for (int i = startValue; i < maxValue; i++) {

            result++;

        }

        return result;

    }


    public int logKomplex(int n) {

        int result = 0;

        for (int i = 1; i <= n; i = i * 2) {

            System.out.println("Round: " + i);

            result = i;

        }

        return result;

    }

  

    public int getArrayIndex(int index, int max) {

        int [] array1 = new int[max];

        Random rnd=new Random();

        for (int i = 0; i < array1.length; i++) {

            array1[i] = rnd.nextInt(max);

        }

      

        return array1[index];

    }


}[/code]


2. Der Controller:


[code=Java]package application;


import javafx.concurrent.Task;

import javafx.fxml.FXML;

import javafx.scene.control.Button;

import javafx.scene.control.ProgressIndicator;

import javafx.scene.control.TextArea;


public class Controller {


    @FXML

    Button startButton = new Button();


    @FXML

    Button cancelButton = new Button();


    @FXML

    ProgressIndicator pi = new ProgressIndicator();


    @FXML

    TextArea messageTextArea = new TextArea();


    Model model = new Model();


    public void startButton() {

        pi.progressProperty().bind(workerTask.progressProperty());

        workerTask.messageProperty().addListener((obs, oldMsg, newMsg) -> messageTextArea.appendText(newMsg + "\n"));

        new Thread(workerTask).start();

        cancelButton.setDisable(false);

    }


    public void cancelButton() {

        workerTask.cancel();

    }


    Task<Integer> workerTask = new Task<Integer>() {

        @Override

        protected Integer call() throws Exception {

            updateMessage("Task started ...");

            final int max = 100;

            int counter;

            for (counter = 0; counter <= max; counter++) {

                if (isCancelled()) {

                    updateMessage("Task cancelled!");

                    break;

                }

                updateMessage("Value at index " + counter + ": " + model.getArrayIndex(counter, max));

                updateProgress(counter, max);

                Thread.sleep(1000);

            }

            updateMessage("Task ended!");

            return counter;

        }

    };


}

[/code]


Ich habe versucht einen Listener auf den workerTask zu legen der die Ausgaben dann in die TextArea schreibt:

[code=Java]workerTask.messageProperty().addListener((obs, oldMsg, newMsg) -> messageTextArea.appendText(newMsg + "\n"));[/code]


Wenn ich den Button drücke werden die Ausgaben von

[code=Java]updateMessage("Value at index " + counter + ": " + model.getArrayIndex(counter, max));[/code]

in der TextArea ausgegeben, allerdings fehlen mir die Ausgaben beim Start "updateMessage("Task started ...");" und beim cancel die "updateMessage("Task cancelled!");" Meldung. Die Meldung "Task ended ..." wird ausgegeben.


Frage:

1. Ist das die richtige Implementierung bezogen auf die Antwort von mrBrown?

2. Warum wird die Start Meldung nicht ausgegeben?


Bin für jeden Tipp dankbar!


Gruß

Ralf



Oben