JavaFX TextField:如何在文本溢出时“自动滚动”到右侧

时间:2017-02-10 10:48:25

标签: string javafx textfield

我正在使用TextField来显示用户在我的应用程序中打开的目录的路径。

目前,如果路径无法放入TextField内,则在远离此控件时,它看起来好像路径已被截断:

file path text overflowing and looks as if it's truncated

我希望TextField的行为设置为当我远离它时,内部显示的路径会自动向右滚动,用户可以看到他们打开的目录。即像这样的东西:

file path text auto scrolling and we can see the innermost directory

我怎样才能做到这一点?我尝试调整here

给出的答案

在我的FXML initialize()类中的Controller方法中如下:

// Controller class fields
@FXML TextField txtMoisParentDirectory;
private String moisParentDirectory;

// ...

txtMoisParentDirectory.textProperty().addListener(new ChangeListener<String>() {

                @Override
                public void changed(ObservableValue<? extends String> observable, String oldStr, String newStr) {
                    moisParentDirectory = newStr;
                    txtMoisParentDirectory.selectPositionCaret(moisParentDirectory.length());
                    txtMoisParentDirectory.deselect();

                }
            });

然而它不起作用。

2 个答案:

答案 0 :(得分:1)

您的问题基于两个事件,即输入的文本长度和失去焦点,因此为了解决这个问题,我使用了属性textProperty()focusedProperty(),结果如下:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Launcher extends Application{

private Pane root = new Pane();
private Scene scene;
private TextField tf = new TextField();
private TextField tft = new TextField();

private int location = 0;

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


    scrollChange(); 
    tft.setLayoutX(300);
    root.getChildren().addAll(tft,tf);
    scene = new Scene(root,400,400);
    stage.setScene(scene);
    stage.show();

}

private void scrollChange(){


    tf.textProperty().addListener(new ChangeListener<String>() {

        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

            location = tf.getText().length();

        }
    });


    tf.focusedProperty().addListener(new ChangeListener<Boolean>() {

        @Override
        public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {

            if(!newValue){

                Platform.runLater( new Runnable() {
                    @Override
                    public void run() {

                        tf.positionCaret(location);

                    }
                });


            }


        }
    });



}


public static void main(String[] args) {

    launch(args); 

}


}

关于Platform.runLater我在这个答案之后加了Here我不知道为什么没有它就行不通,祝你好运!

答案 1 :(得分:0)

tf.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            int location = tf.getText().length();
            Platform.runLater(() -> {
                tf.positionCaret(location);
            });
        }
    });

这也是可行的