Big Word App, En Utilisant Canvas Javafx, Défi Intéressant


Défi intéressant:
Essayer de créer une application qui montre la forme d'un grand mot composé d'un tas de texte répété entré par l'utilisateur.

, j'ai utilisé PixelReader pour obtenir tous les points d'une image de la lettre A:

//create pixel readers and writer to write to canvas
    PixelReader pixreader = imga.getPixelReader();  
    PixelWriter pixwriter = gc.getPixelWriter();

    //point arrays
    ArrayList<Integer> xpoints = new ArrayList<>();
    ArrayList<Integer> ypoints = new ArrayList<>();

    //Read shape of letter by the color of its pixels against a white background
    for(int readY=0;readY<imga.getHeight();readY++){
        for(int readX=0;readX<imga.getWidth();readX++){

            Color color = pixreader.getColor(readX, readY);
            if(!color.equals(Color.WHITE) ){
                //color = Color.TRANSPARENT; 
                xpoints.add(readX);
                ypoints.add(readY);
            }                     
        }
    }

Je reçois le fouillis de mots de l'utilisateur avec:

public void writeOut(String bigWord, String littlewords){

    HBox word = new HBox();
    word.setPadding(new Insets(10,10,10,10));

    String[] letters = bigWord.split("\\B");
    littleWordArray = littlewords.split(" ");
    inputText = littlewords;


private String getRandomSmallWord(){
    int size = littleWordArray.length;
    return littleWordArray[rand.nextInt(size)];
}

Le problème est maintenant que j'ai tous ces points qui forment un A Je veux écrire uniformément le texte dans ce moule...

J'ai échoué avec quelques tentatives le long des lignes de:

for(int ix = 0;ix<xpoints.size();ix+=100){
    String nextWord = getRandomSmallWord();
    int nextwordlength = nextWord.length();
    int currentX = xpoints.get(ix);
    int currentY = ypoints.get(ix);
    gc.strokeText(nextWord,currentX,currentY);
    //gc.strokeText(nextWord,currentX+5,currentY+5);
    //gc.strokeText(getRandomSmallWord(),(currentX+nextwordlength),currentY,30.0);
    System.out.println("("+currentX+", "+currentY+")");

}

Je tends la main aux développeurs seniors là-bas prêtez-moi votre sagesse!

Author: fabian, 2016-12-14

1 answers

Donc ce n'est pas vraiment une question de style StackOverflow et peut-être que je ne devrais pas y répondre ici. Mais de toute façon, voici un exemple d'une approche pour créer un mot composé de petits mots. Il n'utilise pas de Canevas, mais utilise simplement des étiquettes mélangées. Ce n'est probablement pas utile pour vous, mais pourrait vous donner quelques idées à réfléchir. Au moins, j'espère que cela vous aidera à modifier et à clarifier votre question pour vous aider à expliquer plus en détail ce que vous essayez d'accomplir et quel est le problème précis qui vous empêche de le faire.

image

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.effect.BlendMode;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class WordViewer extends Application {

    private static final int NUM_ITERATIONS = 200;
    private static final String bigWords =
            "Lorem";
    private static final String littleWords =
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";

    public void start(Stage stage) {
        Label smallLabel = new Label(
                IntStream.range(0, NUM_ITERATIONS)
                        .mapToObj(i -> littleWords)
                        .collect(Collectors.joining(" "))
        );
        smallLabel.setStyle(
                "-fx-font-size: 9px; " +
                "-fx-background-color: black; " +
                "-fx-text-fill: white"
        );
        smallLabel.setWrapText(true);
        smallLabel.setPrefWidth(1350);

        Label largeLabel = new Label(bigWords);
        largeLabel.setStyle(
                "-fx-font-size: 400px; " +
                "-fx-background-color: black; " +
                "-fx-text-fill: white"
        );

        largeLabel.prefWidthProperty().bind(smallLabel.widthProperty());
        largeLabel.prefHeightProperty().bind(smallLabel.heightProperty());
        largeLabel.setAlignment(Pos.CENTER);

        largeLabel.setBlendMode(BlendMode.MULTIPLY);

        StackPane layout = new StackPane(
                smallLabel,
                largeLabel
        );

        Scene scene = new Scene(layout);
        stage.setScene(scene);
        stage.show();
    }
}
 2
Author: jewelsea, 2016-12-13 22:34:51