JavaFx在文本区域组件上绘制线条

时间:2017-07-29 11:56:50

标签: java javafx

可以在文本区域组件上绘制一组行,如下所示。

然后我需要能够在它们上面输入文字。这些行也需要擦除和重绘

enter image description here

2 个答案:

答案 0 :(得分:0)

您可能希望查看使用TextArea的background属性。

        new TextArea().setBackground(new Background(new BackgroundImage(myImage,BackgroundRepeat.NO_REPEAT,BackgroundRepeat.NO_REPEAT,BackgroundPosition.CENTER,BackgroundSize.DEFAULT)));

此代码假设您可以将这些行作为图像。

您可以在此处找到有关背景的更多信息:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/Background.html

如果您希望更改背景图像并根据当前需求动态,您有两种选择。

  1. 只需在整个项目中使用Canvas。首先在画布上绘制线条,然后在上面绘制字母。这可能会更好,因为它允许您根据需要自定义项目,但需要更多代码和思考。

  2. 使用TextArea,对于BackgroundImage,使用另一个Canvas的快照。您可以使用Canvas绘制您想要的线条,然后使用Snapshot将其转换为图像。

  3. WritableImage i = canvas.snapshot(new SnapshotParameters(), null);

    然后,使用此图像,您可以使用BackgroundImage将其用作TextArea的背景。

答案 1 :(得分:0)

考虑在Pane上绘制线条,如下所示:

public class StageTest extends Application{

    private static final double WIDTH = 100, HEIGHT = 60;

    @Override
    public void start(Stage stage) throws Exception {

        stage.setTitle("Test Stage");
        Label label = new Label("Some text ");
        label.setStyle("-fx-background-color:TRANSPARENT");
        label.setAlignment(Pos.CENTER);
        label.setPrefSize(WIDTH, HEIGHT);

        Pane linesPane = getPane(label);
        StackPane root = new StackPane(linesPane, label);

        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    private Pane getPane(Label label) {

        Pane pane = new Pane();
        pane.setStyle("-fx-background-color:WHITE");
        Line blueLine = new Line();
        blueLine.setStroke(Color.BLUE);
        blueLine.startXProperty().bind(label.layoutXProperty());
        blueLine.startYProperty().bind(label.layoutYProperty().add(label.heightProperty().multiply(.333)));
        blueLine.endXProperty().bind(label.layoutXProperty().add(label.widthProperty()));
        blueLine.endYProperty().bind(label.layoutYProperty().add(label.heightProperty().multiply(.333)));

        Line redLine = new Line();
        redLine.setStroke(Color.RED);
        redLine.startXProperty().bind(label.layoutXProperty());
        redLine.startYProperty().bind(label.layoutYProperty().add(label.heightProperty().multiply(.666)));
        redLine.endXProperty().bind(label.layoutXProperty().add(label.widthProperty()));
        redLine.endYProperty().bind(label.layoutYProperty().add(label.heightProperty().multiply(.666)));

        pane.getChildren().addAll(blueLine, redLine);

        return pane;
    }


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