Big Word应用程序,使用Canvas Javafx,有趣的挑战
有趣的挑战:Big Word应用程序,使用Canvas Javafx,有趣的挑战,java,arrays,arraylist,javafx,Java,Arrays,Arraylist,Javafx,有趣的挑战: 尝试创建一个显示由用户输入的一堆重复文本组成的大词形式的应用程序 我使用了PixelReader从字母A的图像中获取每个点: //create pixel readers and writer to write to canvas PixelReader pixreader = imga.getPixelReader(); PixelWriter pixwriter = gc.getPixelWriter(); //point arrays A
尝试创建一个显示由用户输入的一堆重复文本组成的大词形式的应用程序 我使用了
PixelReader
从字母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);
}
}
}
问题是现在我有了所有这些点,形成了一个A
,我想在这个模子里统一地写下文本
我在以下几方面的尝试都失败了:
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+")");
}
用于(int ix=0;ix所以这不是一个真正的StackOverflow风格的问题,也许我不应该在这里回答。但无论如何,这里有一个创建由较小单词组成的单词的方法示例。它不使用画布,而只是使用混合标签。它可能对您没有用处,但可能会给您一些想法。a至少,我希望它能帮助你编辑和澄清你的问题,帮助你更全面地解释你想要实现的目标,以及阻碍你实现目标的确切原因
我不明白你在问什么。你有包含你想要的结果示例的图像吗?你能提供bigWord
和littlewords
的示例值吗?是的,我有所有字母的黑白块图像,我没有通过“A”,但pixreader绘制了所有点的所有坐标不要形成这样的形象。bigWord和littlewords只是用户输入的任何内容,这一部分是无关的。你越早用示例输入和示例输出更新你的问题,我就越早理解你的问题。我知道你在保存字母a的像素,但我不明白你试图用这些像素做什么。这是真的太棒了!我对混合MDoE一无所知!使一个有点困难的问题变得非常容易;-)
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+")");
}
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();
}
}