Estou tentando controlar uma barra de retângulos e textos (shapes do JavaFX) com botões que (deveriam) movimentar os figuras para a esquerda, direita e parar, conforme o clique em cada botão.
Quando o botão é clicado apenas o último Rectangle e o último Text obedecem os comandos dos botões.
Até que eu consegui alguma coisa, mas como estou aprendendo, está difícil de avançar.
Obrigado!
Intellj Community 2020.1
Java 14
JavaFX 14
2020-07-09T03:00:00Z
Texto pré-formatado
import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main extends Application {
private static int min = 10;
private Pane root = new Pane();
private Parent createContent() {
root.setPrefSize(1200, 500);
for (int i = 0; i < 24; i++) {
Tile tile = new Tile(i * min);
tile.setLayoutX(-5);
tile.setLayoutY(100);
tile.setTranslateX(i * 50);
tile.setTranslateY(i * 0);
root.getChildren().add(tile);
}
return root;
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setScene(new Scene(createContent()));
primaryStage.show();
}
private int veloc = 10000;
private class Tile extends StackPane {
public Tile(int minutos) {
Rectangle border = new Rectangle(50,20);
border.setFill(null);
border.setStroke(Color.BLACK);
Text hText = new Text();
TranslateTransition tRect = new TranslateTransition();
TranslateTransition tHora = new TranslateTransition();
tRect.setNode(border);
tRect.setDuration(Duration.millis(veloc));
tRect.setByX(-1000);
tRect.setCycleCount(Animation.INDEFINITE);
tRect.setAutoReverse(false);
tRect.setInterpolator(Interpolator.LINEAR);
tRect.pause();
tHora.setNode(hText);
tHora.setDuration(Duration.millis(veloc));
tHora.setByX(-1000);
tHora.setCycleCount(Animation.INDEFINITE);
tHora.setAutoReverse(false);
tHora.setInterpolator(Interpolator.LINEAR);
tHora.pause();
// mostra e atualiza a hora
Timeline relogio = new Timeline(new KeyFrame(Duration.ZERO, e -> {
LocalDateTime agora = LocalDateTime.now().plusMinutes(minutos);
DateTimeFormatter formataHora = DateTimeFormatter.ofPattern("HH:mm");
String horaAtual = agora.format(formataHora);
hText.setText(horaAtual);
}),
new KeyFrame(Duration.seconds(1))
);
relogio.setCycleCount(Animation.INDEFINITE);
relogio.play();
getChildren().addAll(border,hText);
ToggleButton tbRecua = new ToggleButton("Recua");
ToggleButton tbPara = new ToggleButton("Para");
ToggleButton tbAvanca = new ToggleButton("Avança");
tbRecua.setLayoutX(50);
tbRecua.setLayoutY(50);
tbPara.setLayoutX(250);
tbPara.setLayoutY(50);
tbAvanca.setLayoutX(450);
tbAvanca.setLayoutY(50);
tbRecua.setOnAction(e -> {
tRect.setByX(-1000);
tHora.setByX(-1000);
tRect.play();
tHora.play();
});
tbPara.setOnAction(e -> {
tRect.pause();
tHora.pause();
});
tbAvanca.setOnAction(e -> {
tRect.setByX(1000);
tHora.setByX(1000);
tRect.play();
tHora.play();
});
root.getChildren().addAll(tbRecua,tbPara,tbAvanca);
}
}
public static void main(String[] args) {
launch(args);
}
}