Java - Jak projít v Timeline celé pole?
Dobrý den,
Potřebuji upravit tento kód
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Example extends javafx.application.Application {
int index = 0;
@Override
public void start(Stage primaryStage) {
var rectangle = new Rectangle(200, 200, Color.BLACK);
var list_of_color = new Color[]{Color.PINK, Color.MAGENTA, Color.RED, Color.GREEN, Color.YELLOW, Color.TURQUOISE, Color.BLUE, Color.ORANGE};
rectangle.setOnMouseClicked((t) -> {
var timeline = new Timeline(new KeyFrame(Duration.millis(400), (event) -> {
rectangle.setFill(list_of_color[index]);
index += 1;
}));
timeline.setCycleCount(list_of_color.length);
timeline.play();
});
primaryStage.setTitle("Example!");
primaryStage.setScene(new Scene(new Pane(rectangle)));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Jde o to, že musím vytvořit řídící proměnou, abych mohl v timeline projít postupně všechny prvky pole.
A problémem je, že v lambda výrazu nelze používat local variable (local variable referenced from a lambda expression must be final or effectively final), proto jsem musel použít global variable.
Nevíte, prosím Vás, jak to upravit, abych globální proměnou nemusel použít?
Děkuji
Ahoj
[Jen tak plácám]
Java není úplně můj šálek kávy, ani jsem příklad příliš neprocházel do detailu.
Možná napíši hloupost, ale proč to pole jednoduše neproiteruješ?
Něco jako:
Pokud je nežádoucí, že prohledávání začne vždycky od prvního prvku, můžeš si odvodit vlastní třídu Color, která bude mít navíc pro tuto příležitost property
enum used -> true, false.
A to zohledníš při podmínce při použití.
[/Jen tak plácám]
Promiňte, ale Váš kód už z principu nefunguje. Timeline pokaždé provede celý cyklus, takže barva je vždy poslední v poli.
Otázka je, čo vlastne chceš dosiahnuť. S JavaFX nemám skúsenosti, ale ak sa má po každom kliknutí spustiť animácia s nasledujúcou farbou, tak si stav niekde musíš pamätať. To, čo máš, by mohlo fungovať. Inak ak chceš meniť stav v lambde, tak môžeš použiť wrapper, ktorý bude final, ako napr. AtomicInteger.
Ak chceš na jedno kliknutie prejsť všetky farby, tak v tom prípade to bude vyzerať nejako takto:
Napadlo mě nevytvářet Rectangle, ale objekt vlastní třídy extend Rectangle, který by měl navíc field int. A s tím bych pracoval. Nicméně, lepší je použít AtomicInteger.
Děkuji. Nejslibněji vypadá Váš kód. Bohužel nefunguje (Rectangle se změní rovnou na poslední barvu v poli) a nepřišel jsem na to, jak to opravit. V čem je, prosím Vás, problém?
Po prečítaní dokumentácie to vyzerá tak, že prvý parameter KeyFrame je čas, v ktorom má daná zmena nastať (pôvodne som myslel, že je to doba trvania frame-u). Takže ju treba vypočítať podľa indexu, asi takto:
Ak má byť farebný prechod plynulý, tak by som si pozrel dokumentáciu k FillTransition.
Ano, vím o FillTransition. Šlo mi pouze o znázornění mého problému. Každopádně perfektní. Už to funguje. Děkuji
Výsledný kód teda vypadá: