操纵和移动场景中的文本

时间:2016-04-06 18:05:28

标签: java javafx-8

我有一个场景,在将文本输入文本字段后,javaFX Text对象将填充输入字段中的文本。

这是代码 -

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class TextEntry extends Application
{
    private static Text textFX;
    public static void main(String [] args)
    {
        launch(args);
    }
    public void start(Stage primaryStage)
    {
        Pane root = new Pane();

        TextField enterText = new TextField();
        enterText.setFont(Font.font("SanSerif",20));

        enterText.textProperty().addListener((obs, oldTextValue, newTextValue) ->
        {           
            textFX = new Text(150,300,newTextValue);
            Font Sanserif = Font.font("Phosphate",50);
            textFX.setFont(Sanserif);
            textFX.setFill(Color.BLUE);
            root.getChildren().add(textFX);
        });

        root.setOnMouseMoved(e ->{
            if(textFX.contains(e.getX(),e.getY()))
                textFX.setOnMouseDragged(f ->{
                    textFX.setX(f.getX());
                    textFX.setY(f.getY());
                });     
        });


        root.getChildren().add(enterText);
        Scene scene = new Scene(root,600,600);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Text Entry");
        primaryStage.show();
    }
}

一些问题 -

  1. 侦听器响应正在输入的文本,但不会删除。它与各种侦听器类型 - 失效侦听器和/或删除侦听器有什么关系吗?我是JavaFX的新手(对Java来说比较新!)并且不完全理解它们。

  2. 每次将新信件输入文本字段时,都会创建多个文本对象。我只想创建一个新对象并对其进行编辑,我意识到这是因为我要求每次更新值时都要创建一个新的文本对象,但是不能想到解决这个问题的方法吗?

    < / LI>

    注意:最终我希望能够以不同的字体和大小创建多个文本对象。

    1. 作为问题编号2的产品。文本项目可以在场景中移动(太棒了!),但只创建了最新版本(不太好)。我不确定我的代码应该发生什么问题?
    2. 对这些问题的任何帮助都将受到大力赞赏!

1 个答案:

答案 0 :(得分:0)

只需创建Text对象并将其添加到屏幕一次,然后在监听器中更新它的文本。

此外,每次鼠标移动时都无需重置拖动侦听器。您只需要注册一次。

public void start(Stage primaryStage)
{
    Pane root = new Pane();

    TextField enterText = new TextField();
    enterText.setFont(Font.font("SanSerif",20));

    textFX = new Text(150,300,"");
    Font Sanserif = Font.font("Phosphate",50);
    textFX.setFont(Sanserif);
    textFX.setFill(Color.BLUE);
    root.getChildren().add(textFX);


    textFX.setOnMouseDragged(e ->{
        textFX.setX(e.getX());
        textFX.setY(e.getY());
    });     


    root.getChildren().add(enterText);
    Scene scene = new Scene(root,600,600);
    primaryStage.setScene(scene);
    primaryStage.setTitle("Text Entry");
    primaryStage.show();
}

此时,您可以使用绑定代替侦听器:

public void start(Stage primaryStage)
{
    Pane root = new Pane();

    TextField enterText = new TextField();
    enterText.setFont(Font.font("SanSerif",20));

    textFX = new Text(150,300,"");
    Font Sanserif = Font.font("Phosphate",50);
    textFX.setFont(Sanserif);
    textFX.setFill(Color.BLUE);
    root.getChildren().add(textFX);


    textFX.textProperty().bind(enterText.textProperty());

    textFX.setOnMouseDragged(e ->{
        textFX.setX(e.getX());
        textFX.setY(e.getY());
    });     


    root.getChildren().add(enterText);
    Scene scene = new Scene(root,600,600);
    primaryStage.setScene(scene);
    primaryStage.setTitle("Text Entry");
    primaryStage.show();
}