【问题标题】:How to add text to each face of a box [JavaFX]如何在框的每个面上添加文本 [JavaFX]
【发布时间】:2018-02-05 08:23:45
【问题描述】:

我创建了一个可以旋转的框,点击后会做什么~一些动作~。例如,我遇到的问题是在此框的所有面上显示文本; 前1个,上2个,后3个,下4个,左5个,右6个。

我知道 StackPane 可用于在多维数据集顶部覆盖一个文本框,但我认为这在这种情况下并没有真正的帮助。 由于 box 本质上是一个预先构建的 TriangleMesh,这可能吗? 就目前而言,box 没有任何内置功能可以做到这一点。

static double mousePosX;
static double mousePosY;
static double mouseOldX;
static double mouseOldY;
public static Scene testScene(Stage stage) {


    Group root = new Group();
    Scene scene = new Scene(root, stage.getWidth(), stage.getHeight(), true, SceneAntialiasing.BALANCED);
    scene.setFill(Paint.valueOf("Blue"));

    PerspectiveCamera camera = new PerspectiveCamera(true);
    camera.setNearClip(0.1);
    camera.setFarClip(10000.0);
    camera.setTranslateZ(-10);
    scene.setCamera(camera);

    Box box = new Box(1,1,1);
    box.setOnMouseClicked(e -> {
        System.out.println("Test");
    });

    Rotate rotateX = new Rotate(10, 0, 0, 0, Rotate.X_AXIS);
    Rotate rotateY = new Rotate(5, 0, 0, 0, Rotate.Y_AXIS);
    box.getTransforms().addAll(rotateX, rotateY);

    scene.setOnMousePressed(me -> {
        mouseOldX = me.getSceneX();
        mouseOldY = me.getSceneY();
    });
    scene.setOnMouseDragged(me -> {
        mousePosX = me.getSceneX();
        mousePosY = me.getSceneY();
        rotateX.setAngle(rotateX.getAngle() - (mousePosY - mouseOldY));
        rotateY.setAngle(rotateY.getAngle() + (mousePosX - mouseOldX));
        mouseOldX = mousePosX;
        mouseOldY = mousePosY;
    });

    root.getChildren().add(box);

    return scene;
}

这是我目前获得的代码,我们将不胜感激。

【问题讨论】:

    标签: java javafx javafx-3d


    【解决方案1】:

    此解决方案基于此question 的答案,其中使用了来自FXyz libraryCuboidMesh

    主要思想是使用图像作为立方体的纹理。内置的 JavaFX Box 会将此图像应用于 6 个面孔中的每一个,因此如果我们想在每个面孔中使用不同的文本,我们必须使用 CuboidMesh,它利用了网络图像:

    立方体可以生成为:

    CuboidMesh cuboid = new CuboidMesh(100f, 100f, 100f);
    cuboid.setTextureModeImage(getClass().getResource("net.png").toExternalForm());
    

    现在的想法是在 6 个面中的每一个上写下文字,并保存稍后将使用的纹理图像。

    这个方法会生成这个网络图片:

    private Image generateNet(String face1, String face2, String face3, String face4, String face5, String face6) {
    
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
    
        Label label1 = new Label(face1);
        label1.setRotate(90);
        GridPane.setHalignment(label1, HPos.CENTER);
    
        Label label2 = new Label(face2);
        GridPane.setHalignment(label2, HPos.CENTER);
    
        Label label3 = new Label(face3);
        GridPane.setHalignment(label3, HPos.CENTER);
    
        Label label4 = new Label(face4);
        GridPane.setHalignment(label4, HPos.CENTER);
    
        Label label5 = new Label(face5);
        GridPane.setHalignment(label5, HPos.CENTER);
    
        Label label6 = new Label(face6);
        label6.setRotate(90);
        GridPane.setHalignment(label6, HPos.CENTER);
    
        grid.add(label1, 1, 0);
        grid.add(label2, 0, 1);
        grid.add(label3, 1, 1);
        grid.add(label4, 2, 1);
        grid.add(label5, 3, 1);
        grid.add(label6, 1, 2);
    
        grid.setGridLinesVisible(true);
    
        ColumnConstraints col1 = new ColumnConstraints();
        col1.setPercentWidth(25);
        ColumnConstraints col2 = new ColumnConstraints();
        col2.setPercentWidth(25);
        ColumnConstraints col3 = new ColumnConstraints();
        col3.setPercentWidth(25);
        ColumnConstraints col4 = new ColumnConstraints();
        col4.setPercentWidth(25);
        grid.getColumnConstraints().addAll(col1, col2, col3, col4);
    
        RowConstraints row1 = new RowConstraints();
        row1.setPercentHeight(33.33);
        RowConstraints row2 = new RowConstraints();
        row2.setPercentHeight(33.33);
        RowConstraints row3 = new RowConstraints();
        row3.setPercentHeight(33.33);
        grid.getRowConstraints().addAll(row1, row2, row3);
        grid.setPrefSize(600, 450);
    
        Scene tmpScene = new Scene(grid);
        tmpScene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
    
        return grid.snapshot(null, null);
    }
    

    其中style.css 包含:

    .root {
        -fx-background-color: white;
    }
    .label {
        -fx-font-size: 6em;
    }
    

    有了它,标签的大小和字体可以适当的调整。

    现在您可以为任何文本生成网络图像:

    Image net = generateNet("1", "2", "3", "4", "5", "6");
    

    最后,您可以将此纹理应用到长方体:

    PhongMaterial mat = new PhongMaterial();
    mat.setDiffuseMap(net);
    cuboid.setMaterial(mat);
    

    您将应用您的文本:

    【讨论】:

    • CuboidMesh 的导入是什么?
    • 你可以找到CuboidMeshhere,导入将是org.fxyz3d.shapes.primitives.CuboidMesh
    • 如果您没有连接到互联网,这个选项仍然可行吗?
    • 只需下载 jar 并将其添加到您的项目中?
    • 感谢您的帮助:)
    猜你喜欢
    • 2020-07-13
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多