Service/Task updateProgress

HaraldK

Mitglied
Hallo,
ich arbeite mich gerade als Anfänger durch Java, mit einigen Büchern als Hilfe.
Es gibt viele einfache Beispiele zu Service/ Task.
Die funktionieren auch.

Also in der MainApp eine Progressbar :
pb1.progressProperty().bind(xyService.progressProperty());
und im Task selbst in einer Schleife:

[CODE lang="java" title="Task"] ....
//--------------------------------------------------------------------------------
// Das stellt die Messzyklen dar - max= Anzahl der Messungen
//--------------------------------------------------------------------------------
for (int i = 0; i < max; i++)
{
// angedeutete Messung
// der Messwert soll auch aktuell im GUI dargestellt werden
messwert = tempmessen();
System.out.println(messwert); //das geht
// aktualisiert die Progressbar
updateProgress(i, max); //funktioniert
//updateProgress(messwert,100); // das nicht
}
updateMessage("Fertig");
return max;[/CODE]

So wie die Schleife durchlaufen wird, zeigt es auch der Balken an. OK
Wenn aber der Task, Aufgaben für mich erledigt, möchte ich z.B.
das eine Variable aus dem Task, eine 2. Progressbar aktualisiert.
Kann ich eine 2.Progressbar an eine Variable des Task binden ?
Hier z.B messwert
pb1.progressProperty().bind(xyService.progressProperty(messwert));
sowas in der Art ?

Danke
 

Jw456

Top Contributor
Laut Doku gibt es double oder long.

Der Messwert wir wohl ein double sein eine KommaZahl und dann muß laut Doku der Max Wert auch ein Kommazahl sein ist es aber nicht.
also 100.0 und nicht nur 100

Java Zahlen immer mit Punkt nicht Komma

Ein int zu long geht deshalb geht es auch mit
updateProgress(i, max)


Welcher Typ Messwert hat musst du wissen.
PS der Update Wert muss im Bereich 0 bis max sein wenn dein Messwert zb - 20 oder 110 ist geht es auch nicht
 
Zuletzt bearbeitet:

HaraldK

Mitglied
Das verstehe ich nicht.
ich brauche ja updateProgress(i, max) und updateProgress(messwert, 100) zum Beispiel.
Je für eine Progressbar, und das funktioniert nicht.
 

Jw456

Top Contributor
wie du in der Doku siehst gibt es zwei Methoden eine wo du Long und eine wo du Double Werte übergeben musst.
Nicht gemischt. wenn jetzt messwert ein double ist, und 100 als zweiter wert ist das ein Long. geht nicht. beides muss double sein.
deshalb meine erste frage was ist messwert für ein datentyp.
und nicht welchen du benutzen willst.

100 ist ein int oder long
100.0 ist ein double
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also ich verstehe noch nicht so ganz Dein Problem.

Erst einmal mein Verständnis, was Du bisher gemacht hast:
- Du nutzt JavaFX
- Du hast eine ProgressBar
- Diese bindest Du per bind Aufruf an eine Property.

Die progressProperty() ist ja eine DoubleProperty. Diese kannst Du per bind an ein Observable binden. (Was Du ja vermutlich gemacht hast.)

Das was Du mit einer ProgressBar gemacht hast, kannst Du mit beliebigen ProgressBars machen. Dazu brauchst Du nur ein entsprechendes Observable. Du könntest also einfach irgendwo eine DoubleProperty als Variable haben um dann den entsprechenden bind aufzurufen.
 

HaraldK

Mitglied
Hallo,
ja Java FX und 2 x Progressbar.
Die eine mit dem i funktioniert "pb1.progressProperty().bind(xyService.progressProperty());"
Damit soll bzw. wird die UI aktualisiert.
Aber wie binde ich die 2. Progressbar am "messwert" ?
 

Jw456

Top Contributor
Beantworte meine Frage von welche Datentyp ist Messwert?

Es gibt nur zwei Update Methoden eine in der die übergebe Werte vom Typ long und eine wo sie vom Typ double sein müssen.

Wenn Messwert zb double ist und du für max nur 100 in der Methode hast geht es nicht.

Wenn Messwert vom Typ float ist müsstest du ihn zu double Casten.

Noch mal welcher Typ ist Messwert.
Sonst kommen wir hier nicht weiter.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Ok dann benutze 100.0 als zweiten Wert.
//updateProgress(i, max); //funktioniert updateProgress(messwert,100.0)

PS der kompiler übersetzt die 100 zu int
100.0 zu double
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Wenn dein Code solange laufen soll bis Messwert den max Wert hat ist eine for Schleife nicht sinnvoll. Dann eine while Schleife die prüft ob Messwert gleich max ist und dann beendet wird.
 
K

kneitzel

Gast
@Jw456 Es geht um ein Binding!

@HaraldK Damit Du ein Binding machen kannst, brauchst Du ein Observable. Du kannst also eine DoubleProperty erstellen und in dieser einfach die Werte setzen. Und für das Binding rufst Du einfach bind auf und übergibst das Observable.

Setzen kannst Du z.B. mittels der Methode setValue(Number)
 
K

kneitzel

Gast
Also nur einfach noch einmal im Detail, um das zu erläutern:
- Task kann einem eine ReadOnlyDoubleProperty geben (progressProperty()). Und diese ist ähnlich wie auch die DoubleProperty eine Observable und kann daher per bind an Controls gebunden werden.
- Somit funktioniert es super: Du machst ein bind der Property and die entsprechende Property vom Control. Und im Task aktualisierst Du den Wert mit updateProgress.

Das funktioniert richtig, wie @HaraldK bestätigt hat. Das Problem ist nun, dass es einen double Wert gibt, den er gerne an ein anderes Control geben möchte:
möchte ich z.B.
das eine Variable aus dem Task, eine 2. Progressbar aktualisiert.

Da gibt es generell zwei Wege:
a) Man kann die ProgressBar selbst aktualisieren.(setProgress Aufruf - das aber bitte im korrekten Thread, daher mit Platform.runLater!)
b) Wenn man dies per Binding machen möchte, dann braucht man wieder eine Property, die man dafür verwenden kann. Da kommt dann also eine DoubleProperty zum tragen. Da kann man dann ein bind durchführen. Hier ist aber ggf. wieder ein Platform.runLater notwendig - das habe ich gerade nicht im Blick, ob das von den Property Klassen schon beachtet wird!)

Der Wert, der gesetzt wird, sollte natürlich zwischen 0 ... 1 sein, daher sowas wie 100.0 / maxValue * messwert rechnen.
 
K

kneitzel

Gast
Hier ist aber ggf. wieder ein Platform.runLater notwendig - das habe ich gerade nicht im Blick, ob das von den Property Klassen schon beachtet wird!
Ich habe jetzt einfach mal im Source vom Task nachgesehen. Da wird das Ändern der Property auch mit Platform.runLater gemacht - daher solltest Du das ebenso handhaben.
 
K

kneitzel

Gast
Ok das habe ich wohl in der Doku über sehen. Bei double 0-1. Und "max" müsste dann 1 sein.
Wenn das updateProgress vom Task genützt würde, dann wird das ja automatisch entsprechend umgerechnet, sprich intern wird daraus dann auch ein entsprechender Wert gemacht (workDone / max)

(Ich habe es im Text richtig geschrieben als Wert zwischen 0 und 1 - aber ich habe dann für 0..100 den Code geliefert. Das ist natürlich falsch. Es muss einfach max / messwert gerechnet werden!)

Ansonsten vielleicht der Hinweis, dass dieses 100.0 statt 100 egal sein. Die Methode spielt hier eh keine Rolle, aber nehmen wir einfach einmal den Fall, wir haben eine Methode mit zwei double Parametern. Und nun gebe ich ein double und ein int Parameter an.

Das funktioniert natürlich. Hintergrund ist, dass ein int implizit zu einem double gecastet werden kann.
 

Jw456

Top Contributor
Ich habe seinen Code zu Grunde gelegt und da sagt er das es mit Messwert nicht geht aber mit dem int aus der for Schleife.

Wenn er double und long mischt geht die Methode bestimmt nicht.

Das mit einem observer war zu dem Zeitpunkt noch gar nicht das Thema.

In seinem Code macht er es ja noch von Hand.

PS alles was du jetzt gesagt hast habe ich im Grunde auch schon gesagt
Deshalb auch die Frage nach dem Datentyp
 
K

kneitzel

Gast
Das mit einem observer war zu dem Zeitpunkt noch gar nicht das Thema.
Doch, das war von Anfang an das Thema:
Kann ich eine 2.Progressbar an eine Variable des Task binden ?

Das war die Kernfrage. Es ging nie darum, dass er den Progress aus dem Task, den er gezeigt hat, anders setzen will. Es sagt explizit, dass der Code so, wie er ihn da gezeigt hat, funktioniert - so wie er möchte. Daher sind da keinerlei weitere Aufrufe von updateProgress zu ergänzen und der vorhandene Aufruf muss nicht verändert werden. Alles was er will ist eben eine zweite Progressbar an eine Variable aus dem Task binden.
 

Jw456

Top Contributor
Doch, das war von Anfang an das Thema:


Das war die Kernfrage. Es ging nie darum, dass er den Progress aus dem Task, den er gezeigt hat, anders setzen will. Es sagt explizit, dass der Code so, wie er ihn da gezeigt hat, funktioniert - so wie er möchte. Daher sind da keinerlei weitere Aufrufe von updateProgress zu ergänzen und der vorhandene Aufruf muss nicht verändert werden. Alles was er will ist eben eine zweite Progressbar an eine Variable aus dem Task binden.
Nicht ganz im Code ist die Zeile

updateProgress(i, max); //funktioniert
//updateProgress(messwert,100); // das nicht
 
K

kneitzel

Gast
Nacht das die Methode wirklich selber?
Das muss ja als erstes der Compiler machen, der dann etwas baut, das die JVM ausführen kann.

Und da kommt dann die JLS ins Spiel:

15.12 Method Invocation Expressions
Hier ist dann in 15.12.2.4 der Aufruf von Methoden mit Variablen:
  • If m is not a generic method, then m is applicable by variable arity invocation if, for 1 ≤ ik, either ei is compatible in a loose invocation context with Ti (§5.3) or ei is not pertinent to applicability.
Wir haben keine generische Methode daher scheint das zu passen - und da muss eine loose invocation context möglich sein ... Das ist in 5.3 erklärt:
5.3 Invocation Context
Loose invocation contexts allow a more permissive set of conversions, because they are only used for a particular invocation if no applicable declaration can be found using strict invocation contexts. Loose invocation contexts allow the use of one of the following:
  • a widening primitive conversion (§5.1.2)
5.1.2 Widening Primitive Conversion
19 specific conversions on primitive types are called the widening primitive conversions:
  • int to long, float, or double

Also ja - int kann für double Parameter angegeben werden.
 

Jw456

Top Contributor
Ok dann hätte die
Zeile updateProgress(messwert,100);
Zu mindestens solange die for läuft etwas anzeigen müssen. Kommt natürlich auch drauf an in welchen Bereich sich sein Messwert den er ja vorher selber holt ist.
PS
Da stellt sich jetzt die Frage ob das abfragen im Thread auch korrekt funktioniert.
messwert = tempmessen();
Dann wird messwert wohl keinen sinnvollen Wert bekommen haben.
 
Zuletzt bearbeitet:

HaraldK

Mitglied
Nun komme ich als Anfänger erst mal nicht mehr mit.
Ausgangspunkt war:
Kann ich eine 2.Progressbar an eine Variable des Task binden ?
jetzt habe ich

Java:
 for (int i = 0; i < max; i++)
        {
           // angedeutete Messung
           // der Messwert soll auch aktuell im GUI sein
            messwert = 50.0;
            //System.out.println(messwert);
            // aktualisiert die Progressbar
            updateProgress(i, max);
            // soll die 2.Progressbar aktualisieren
            updateProgress(messwert,100.0);
   }

Wenn ich den messwert hier mal festmache, sollte jetzt
der eine Balken den Fortschritt von i und der 2.Balken bei 50% stehen.
Tun sie aber nicht ?
Java:
pb1.progressProperty().bind(xyService.progressProperty());
pb2.progressProperty().bind(xyService.progressProperty());

Ich hätte nicht gedacht das es so ein Problem ist die Gui zu aktualisieren.
Eigentlich, nach den Büchern welche ich abarbeite, soll ja der Task die Arbeit
getrennt von der Gui machen.
In der Praxis wären das z.B. 100 Einzel-Messungen, und die Variable "messung" wäre der Durchschnitt
der am Ende zurückgegeben wird. Während der 100 Durchläufe
sieht man dem Messwert live und auch den Fortschritt. So der Gedanke.
Hier im Beispiel einfach 50.0, muss ja auch funktionieren.
In C# ging das mit invoke irgendwie einfach, da habe ich es schon mal gemacht.
Aber Windows verwende ich nicht mehr und hoffte nun mit Java unter Linux
meine Freude zu haben
 
K

kneitzel

Gast
Der task hat genau eine progressProperty und die kann nur einen Wert haben.

Was Du also willst ist:
a) Eine weitere Property, in der Du Werte speichern kannst.Das wäre in der Klasse vom Task sowas wie:
Java:
private DoubleProperty messwertProperty = new DoubleProperty();
private final double maxMesswert=100; // Das halt ggf. anpassen!

b) Diese Property kannst Du an die zweite ProgressBar binden:
Java:
pb2.progressProperty().bind(messwertProperty);

c) Wann immer Du da den Wert ändern willst, machst Du nun etwas wie:
Java:
Platform.runLater(() => messwertProperty.setValue(maxMesswert / messwert));

Bei c ist ein Lambda benutzt worden. Das wirst Du evtl. noch nicht kennen. Das ist eine Kurzform für eine Konstrukt a.la.

Java:
// () => messertProperty.setValue(......); wäre ein:
new Runable() {
    public void run() {
        messwertProperty.setValue(maxMesswert / messwert);
    }
}

Das wäre die Zusammenfassung der Änderungen. Falls messwert 0 sein kann, dann wäre das ggf. noch zu behandeln.
 

Jw456

Top Contributor
Hallo eine frage wo ist denn dein code ich denke in dem xyService.
wenn du zwei Progresbars haben willst müstest du auch zwei servise Thread haben.
bei deinem test mit fest 50
sind bestimmt beide bei 50%

Beide Progress sind ja an den gleichen xyService gebunden.
zwei getrennte Progress zwei getrennte Threads .




Frage zwei oder teste mit dem Debugger ob du Überhaupt einen gültigen messwert in dem Thread bekommst.

Ps ok ich war zulangsam
 
Zuletzt bearbeitet:

HaraldK

Mitglied
Danke, aber ich bekomme es nicht hin :-(

Ich verstehe zwar das die 2. PBar an eine neue Eigenschaft gebunden werden muss.
Das ist ja das hier.
private DoubleProperty messwertProperty = new DoubleProperty();
aber egal wo ich es eintrage, gibts nur Fehler.
Vielleicht könnt ihr das mal hier eintragen, es ist ja nur ein Beispiel zum Lernen.
Hier die 3 Dateien App / Service / Task (aus dem Buch)
Ich will es ja verstehen


Java:
package com.company.threads;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class App extends Application {
    
    GridPane myPane = new GridPane();
    static int messwert;
    
  
    public static void main(String[] args) throws Exception
    {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        TempService tempService = new TempService(400);
        
        ProgressBar pb1 = new ProgressBar();
        ProgressBar pb2 = new ProgressBar();
        
        pb1.setProgress(0);
        pb2.setProgress(0);
              
        Label label = new Label();
        Button btn = new Button();
        
        
        btn.setOnAction(new EventHandler<ActionEvent>()
        {
            @Override
            public void handle(ActionEvent event)
            {
                tempService.restart();
            }
        });
      
        tempService.start();
        
        btn.textProperty().bind(tempService.messageProperty());
        label.textProperty().bind(tempService.messageProperty());
        
        
        pb1.progressProperty().bind(tempService.progressProperty());
        pb2.progressProperty().bind(tempService.messwertProperty);
      
        
        
        myPane.add(btn,1,1);
        myPane.add(pb1,1,2);
        myPane.add(pb2,1,3);
        myPane.add(label,1,4);
      
        
        Scene scene = new Scene(myPane,300,300);
        primaryStage.setScene(scene);
        
        primaryStage.show();
    }

}

Java:
package com.company.threads;

import javafx.concurrent.Task;


public class TempService extends javafx.concurrent.Service<Integer>
{

    private final int max;
 
    public TempService(int max)
    {
        this.max = max;
    }

    @Override
    protected Task<Integer> createTask()
    {
       return new TempTask(max);
    }
 }
Java:
package com.company.threads;

import javafx.concurrent.Task;

public class TempTask extends Task<Integer>
{

    int max;
    double messwert;
  
    public TempTask(int max)
    {
        this.max = max;
        updateMessage("Bereit zum messen...");
    }

    @Override
    protected Integer call() throws Exception
    {
        updateMessage("messe Temp");
        
        //-----------------------------------------
        // Das stellt die Messzyklen dar
        //-----------------------------------------
        for (int i = 0; i < max; i++)
        {
            Thread.sleep(20);
            // angedeutete Messung
            // der Messwert soll auch aktuell im GUI zu sehen sein
            messwert = 50.0;
            updateProgress(i, max);
            
        }
          updateMessage("Fertig");
          return max;
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
du brauchst zwei verschidene Klassen von Task
Nein, dann hätte man zwei unabhängige Tasks.


private DoubleProperty messwertProperty = new DoubleProperty();
aber egal wo ich es eintrage, gibts nur Fehler.
Das muss eine Instanz-Variable in TempTask sein.
Für diese Variable erstellst du zusätzlich einen Getter oder machst sie public (ersteres ist zu bevorzugen).

Immer wenn sich der Messwert ändert (dort, wo du auch updateProgress aufrufst), updatest du dann zusätzlich die Messwert-Property:
c) Wann immer Du da den Wert ändern willst, machst Du nun etwas wie:
Java:
Platform.runLater(() => messwertProperty.setValue(maxMesswert / messwert));


In deiner GUI musst du diese Messwert-Property dann nur noch an die zweite Progressbar binden, das hast du im wesentlichen schon, du musst dort nur u.U. statt dem Attribut direkt den Getter nutzen.
 
K

kneitzel

Gast
Das ist jetzt etwas doof, da du hier Klassen dazwischen hast, die es verkomplizieren. Aber legen wir einfach mal los:

Java:
public class TempService extends javafx.concurrent.Service<Integer>
{

    private final int max;
 
     public DoubleProperty messwertProperty = new DoubleProperty();
    
    public TempService(int max)
    {
        this.max = max;
    }

    @Override
    protected Task<Integer> createTask()
    {
       return new TempTask(max, messwertProperty);
    }
 }

Also messwertProperty hinzugefügt und diese wird dem TempTask auch gegeben.

Java:
public class TempTask extends Task<Integer>
{

    int max;
    double messwert;
    DoubleProperty messwertProperty;
    
    public TempTask(int max, DoubleProperty messwertProperty)
    {
        this.messwertProperty = messwertProperty;
        this.max = max;
        updateMessage("Bereit zum messen...");
    }

    @Override
    protected Integer call() throws Exception
    {
        updateMessage("messe Temp");
        
        //-----------------------------------------
        // Das stellt die Messzyklen dar
        //-----------------------------------------
        for (int i = 0; i < max; i++)
        {
            Thread.sleep(20);
            // angedeutete Messung
            // der Messwert soll auch aktuell im GUI zu sehen sein
            messwert = 50.0;
            updateProgress(i, max);
        }
          updateMessage("Fertig");
          return max;
    }
}

So in der Art - jetzt hast Du in TempTask die messwertProperty und die kannst Du setzen mit dem Plattform.runLater, das ich schon gezeigt habe. Da sehe ich jetzt aber nicht, wo du das wie haben willst ...
 

Jw456

Top Contributor
Wenn ich sein Vorhaben richtig verstehe will er gar nicht von außerhalb das Update anstoßen. Er hat die for Schleife und bei jedem Durchlauf will er das die zweite P Bar geupdatet wird.

Den messwert hat er jetzt fest auf 50.
In der for Schleife.
 

HaraldK

Mitglied
Hallo Danke an alle,

Wenn ich das im tempTask so mache, wie oben beschrieben, kann ich die bp2 nicht daran binden.
so oder so
pb2.progressProperty().bind(getMesswert);
pb2.progressProperty().bind(temp.Service.getMesswert);


Java:
private DoubleProperty messwertProperty ;  
   
    public final double getMesswert() {
        if (messwertProperty != null)
            return messwertProperty.get();
        return 0;
    }

und in der Variante von Kneitzel
scheitert es an dieser Zeile, wahrscheinlich sehe ich nach Stunden probieren nicht mehr durch.

[CODE lang="java" title="tempService"] public DoubleProperty messwertProperty = new DoubleProperty();[/CODE]

die meckert er an. DoubleProperty is abstract, cannot be instantiated

Ich glaube ich gebe jetzt auf.
Übermorgen muss ich 2 Wochen in den Urlaub, da nehme ich meine Java Bücher mit.
Vielleicht gibt es da was Erhellendes und ich melde mich nochmal.
Vielen Dank für die schnelle Hilfe.
 
K

kneitzel

Gast
Sorry, wenn man Code im Forum schreibt, dann hat man halt keinerlei Unterstützung einer IDE. Ja die Klasse DoubleProperty ist abstrakt. Mach da mal ein new SimpleDoubleProperty(); draus. (Also einfach noch ein Simple davor und das nur bei der Erzeugung.)
 

HaraldK

Mitglied
an dieser Zeile scheitert es, wahrscheinlich sehe ich nach Stunden probieren nicht mehr durch.
Java:
public DoubleProperty messwertProperty = new DoubleProperty();

die meckert er an. DoubleProperty is abstract, cannot be instantiated

Ich glaube ich gebe jetzt auf.
Übermorgen muss ich 2 Wochen in den Urlaub, da nehme ich meine Java Bücher mit.
Vielleicht gibt es da was Erhellendes und ich melde mich nochmal.
Vielen Dank für die schnelle Hilfe.
 

HaraldK

Mitglied
Hallo,
unglaublich jetzt geht es, zumindest erst mal vom Prinzip.
Jetzt zeigt der 1.Balken den Fortschritt und der zweite Balken den Wert 0.3 oder in echt, mal die Messung an:).
Ich bin begeistert.

[CODE lang="java" title="tempTask"]messwertProperty.setValue(0.3);
updateProgress(i, max);[/CODE]

nun bleibt mir es das noch zu verstehen, viel zu lesen, habe ja Urlaub und als Rentner auch Zeit.

Also Danke allen bis hierher.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
6 Best Practice Feedback zu Service / JUnit Tests Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
izoards Prunsrv - Windows Service - .bat file starten Java Basics - Anfänger-Themen 84
I Kommunikation "normaler PC" mit lokaler Software an "Cloud Service" und umgekehrt Java Basics - Anfänger-Themen 15
S Mit Cloud Messaging Service starten Java Basics - Anfänger-Themen 2
S Android Service ferngesteuert starten Java Basics - Anfänger-Themen 5
T Windows service erstellen Java Basics - Anfänger-Themen 1
B Windows Service erstellen Java Basics - Anfänger-Themen 2
B Print Service Java Basics - Anfänger-Themen 5
J XML-Strukturen für REST-Service erstellen Java Basics - Anfänger-Themen 1
O Watch Service erkennt Datei Änderung nicht Java Basics - Anfänger-Themen 0
I AWS Event Notification Service Sample ausführen... Java Basics - Anfänger-Themen 7
G HttpUnit 503 Service Unavailabl Java Basics - Anfänger-Themen 2
C Servlets: doPost() etc. anstatt service() Java Basics - Anfänger-Themen 4
S Wie debugge ich dies am besten: SingleThreadExecutor führt Task nicht aus..? Java Basics - Anfänger-Themen 29
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
H Windows Task erstellen Java Basics - Anfänger-Themen 7
S timer task problem Java Basics - Anfänger-Themen 2
L Geplante Task + Java Programm Java Basics - Anfänger-Themen 9
ff java.lang.NoClassDefFoundError: task/class Java Basics - Anfänger-Themen 4
P task im hintergrund? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben