GUI verändern mit JavaFX

Sugan

Mitglied
Hallo zusammen,

ich möchte, dass sich bei meinem Spiel verschiedene Dinge bewegen...
Zum einem im Hintergrund eine dauerhafte Schleife und zum underen per Knopfdruck. Dabei ist es wichtig, dass alle Bewegungen gleichzeitig angezeigt werden, also eigentlich was ganz normales.
Ich programmiere seit einiger Zeit mit JavaFX und habe dann auch irgendwann rausfinden dürfen, dass die guten alten Threads nicht mehr die GUI verändern dürfen. Stattdessen benutze ich jetzt Services, die über updateValue bestimmte Werte ändern. So weit so gut, doch ich kann ja schlecht für jede Bewegung einen Service programmieren :eek:

Oder etwa doch? Ich hab das Gefühl, dass es hier eine viel leichtere Lösung geben muss...

Mir würde hierzu ein einfaches Bsp. helfen:

In der Mitte des Bildschirms ist ein Knopf. Immer, wenn man auf den Knopf drückt, erscheint ein kleines Symbol (der einfachheit halber ein Label) und "fliegt" dann nach oben. Wenn man schnell hintereinander drückt, sollen entsprechend mehrere Labels sichtbar sein, da sie hintereinander nach oben "fliegen".

Hier mein Code dazu (bis jetzt mit einem Service, entsprechend kann immer nur ein Label angezeigt werden):

Java:
import javafx.application.Application;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class Game extends Application{
  
    int max = 10;
    int click = 0;

    AnchorPane root = new AnchorPane();
    Button button = new Button("Bitte\ndrücken");
    Label[] labels = new Label[max];
    Service<Integer> label0Thread;
  
    @Override
    public void start(Stage stage) throws Exception {
      
         label0Thread = new Service<Integer>() {
             protected Task<Integer> createTask() {
                 return new Task<Integer>(){
                     @Override
                     protected Integer call() throws Exception {
                         labels[0].setVisible(true);
                         for(int i=0; i<50; i++){
                             updateValue(250-i*2);
                             Thread.sleep(10);
                         }
                         labels[0].setVisible(false);
                         return null;
                     }
                 };
             }
         };
      
        for(int i=0; i<max; i++){
            labels[i] = new Label();
            labels[i].setText("ping");
            root.getChildren().add(labels[i]);
            labels[i].setVisible(false);
            labels[i].setTranslateX(288);  
            labels[i].setTranslateY(230);
        }
        labels[0].translateYProperty().bind(label0Thread.valueProperty());
      
        button.setPrefSize(100, 100);
        button.setTranslateX(250);
        button.setTranslateY(250);
         button.setOnAction(event -> {
             label0Thread.restart();
         });
       
         root.getChildren().add(button);
       
        Scene scene = new Scene(root,600,600);      
         stage.setScene(scene);
         stage.show();
       
    }
    public static void main(String[] args){
        launch(args);
    }  
}



vielen Dank für eure Hilfe!

Sugan
 

TheBohne

Aktives Mitglied
Wie wäre es mit einer Klasse die alle grafischen Objekte beinhaltet und in der es einen Thread gibt der mittels
Code:
Platform.runLater(new Runnable() {

             @Override
             public void run() {
}
})
alle Objekte Aktualisiert. Diese Methode kannst du ja dann alle 100ms aufrufen und mittels wait und notify warten bis sie duchgelaufen ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Position eines Image verändern mithilfe eines Timers Spiele- und Multimedia-Programmierung 6
M [JAVA 3D] Position des Objektes verändern Spiele- und Multimedia-Programmierung 16
B Objekte zur Laufzeit verändern Spiele- und Multimedia-Programmierung 3
D Polygonsize durch das umliegende Reckteck verändern inJava2D Spiele- und Multimedia-Programmierung 6
K KeyNavigatorBehavior Attribute verändern Spiele- und Multimedia-Programmierung 3
D OrbitBehavior Rotationspunkt verändern? Spiele- und Multimedia-Programmierung 5
A Körper während der livezeit in seiner Form verändern? Spiele- und Multimedia-Programmierung 4
J javafx seltsames Verhalten mediaplayer Spiele- und Multimedia-Programmierung 23
L Minecraft [Minecraft] Spigot und JavaFX mit fxml Spiele- und Multimedia-Programmierung 0
K Video aus JavaFX Images generieren Spiele- und Multimedia-Programmierung 2
L Coordinate Space JavaFX 2d Spiel Spiele- und Multimedia-Programmierung 0
Cromewell JavaFX Kollisionserkennung Spiele- und Multimedia-Programmierung 6
L JavaFX Objekte bewegen Spiele- und Multimedia-Programmierung 3
wolfgang63 Mit JavaFX einfaches Game programmieren Spiele- und Multimedia-Programmierung 5
M JavaFX - MouseDragReleased ruft MouseDragExited auf Spiele- und Multimedia-Programmierung 2
G javafx MediaPlayer sound problem Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben