2014-06-29 1 views
0

Je cherche une méthode pour faire des lignes de texte auto-défilement en boucle continue avec JavaFX. Ceci est très similaire à la credits-like scrolling dans ces questions ci-dessous. C'est un écran de poste de travail, pas un mobile. Le texte est une sorte de fixe, pas d'un flux, donc je veux faire circuler ...Comment pouvons-nous faire défiler le texte automatiquement en boucle continue?

Un simple cas d'utilisation: vous avez 30 lignes de texte, mais seulement 12 lignes peuvent être visibles à tout moment. Donc, je veux faire défiler le texte vers le haut de l'écran avec un peu de pause au fond, puis le texte s'enroule et continue à défiler.

Je pensais que je pouvais simplement ajouter du texte en bas et l'enlever par le haut, il s'avère que ce n'est pas la même chose. L'effet visuel de l'utilisation d'un défilement vers le haut ... est littéralement la partie importante de la spécification. Donc je suis de retour au début.

Certaines choses que je préférerais ne pas avoir besoin de détruire le texte ou de le recharger. Préférez pointer vers le haut de la zone de texte en cours ou quelque chose de sorte qu'il s'enroule autour. Sinon, c'est comme avant, et je dois enlever le texte du haut et mettre le texte en bas. Besoin de JavaFX, ne peut pas utiliser Javascript pour l'application. Quel est ton meilleur coup? Merci d'avance.

Répondre

1

Voici quelques texte défilant

import javafx.animation.KeyFrame; 
import javafx.animation.KeyValue; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class Scroll extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     VBox vbox = new VBox(); 
     for (int i = 0; i < 30; i++) 
      vbox.getChildren().add(new Text("line " + i)); 
     //add a copy of the first 12 lines that will be showing as wrapped 
     for (int i = 0; i < 12; i++) 
      vbox.getChildren().add(new Text("line " + i)); 

     ScrollPane sp = new ScrollPane(vbox); 
     Scene scene = new Scene(sp, 300, 10*12);//guess height 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
     //resize to exactly 12 lines 
     double textHeight = vbox.getHeight()/vbox.getChildren().size(); 
     primaryStage.setHeight(textHeight*12+primaryStage.getHeight()-scene.getHeight()); 

     Timeline timeline = new Timeline(); 
     timeline.setCycleCount(Timeline.INDEFINITE); 
     KeyValue kv = new KeyValue(sp.vvalueProperty(), sp.getVmax()); 
     KeyFrame kf = new KeyFrame(Duration.millis(5000), kv); 
     timeline.getKeyFrames().addAll(kf); 
     timeline.play(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Je compris que ce n'est pas ce que vous voulez. J'ai essayé quelques astuces pour prendre une image de la vbox et la jouer encore et encore, mais il y a du bégaiement à moins que vous l'ayez juste. C'est seulement pour satisfaire à l'exigence de ne lire le texte qu'une seule fois. Ce dont vous avez besoin, c'est d'une structure circulaire qui défile doucement, comme un cylindre. Voir mon autre réponse pour s'amuser.

+0

Oh, je vois. Le texte est mis à jour dynamiquement. Une autre raison pour moi de vouloir «rester dans la zone réservée au texte». – will

+0

Je l'ai édité pour redimensionner la scène à exactement la bonne taille pour rendre l'emballage lisse. Je ne comprends pas votre commentaire juste au-dessus de ça. Il doit mettre à jour 'dynamiquement' pour montrer le défilement. – brian

0

Ok, je pense que j'ai toutes les exigences lol.

import javafx.animation.KeyFrame; 
import javafx.animation.KeyValue; 
import javafx.animation.Timeline; 
import javafx.application.Application; 
import javafx.geometry.Point3D; 
import javafx.scene.Group; 
import javafx.scene.PerspectiveCamera; 
import javafx.scene.PointLight; 
import javafx.scene.Scene; 
import javafx.scene.SnapshotParameters; 
import javafx.scene.image.WritableImage; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.paint.PhongMaterial; 
import javafx.scene.shape.Cylinder; 
import javafx.scene.text.Text; 
import javafx.scene.transform.Rotate; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class Scroll extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 

     //a vbox to take a picture of 
     VBox vbox = new VBox(); 
     for (int i = 0; i < 30; i++) 
      vbox.getChildren().add(new Text(" longer line of text " + i + " ")); 

     //take a sideways picture to fit the cylinder 
     SnapshotParameters snapshotParameters = new SnapshotParameters(); 
     snapshotParameters.setTransform(new Rotate(90)); 
     WritableImage snapshot = vbox.snapshot(snapshotParameters, null); 

     //make sideways cyl with image 
     PhongMaterial material = new PhongMaterial(); 
     final Cylinder cylinder = new Cylinder(500, snapshot.getWidth(),30); 
     material.setDiffuseMap(snapshot); 
     cylinder.setMaterial(material); 
     cylinder.setRotate(-90); 
     cylinder.setTranslateX(snapshot.getWidth()); 
     cylinder.setTranslateY(500); 

     //lights camera show 
     final Group root = new Group(); 
     root.getChildren().add(cylinder); 

     final Scene scene = new Scene(root, snapshot.getWidth()*2, cylinder.getRadius()*2, true); 
     PointLight pointLight = new PointLight(Color.ALICEBLUE); 
     pointLight.setTranslateX(150); 
     pointLight.setTranslateY(500); 
     pointLight.setTranslateZ(-1000); 
     PerspectiveCamera cam = new PerspectiveCamera(false); 
     scene.setCamera(cam); 
     root.getChildren().addAll(pointLight, cam); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 

     //I'll spin bob 
     Rotate rx = new Rotate(); 
     rx.setAxis(Rotate.Y_AXIS); 
     cylinder.getTransforms().add(rx); 
     cam.setRotationAxis(Point3D.ZERO); 
     Timeline timeline = new Timeline(); 
     timeline.setCycleCount(Timeline.INDEFINITE); 
     final KeyValue kv = new KeyValue(rx.angleProperty(), -360); 
     final KeyFrame kf = new KeyFrame(Duration.millis(10000), kv); 
     timeline.getKeyFrames().add(kf); 
     timeline.play(); 
    } 
} 

enter image description here

+0

Il a l'air très joli. Il doit être un texte, ne peut pas être une WritableImage ou une manipulation graphique. L'utilisateur final est très précis sur ce qu'il veut. C'est très impressionnant quand même. – will

Questions connexes