始终显示TextArea中的最后一行

时间:2014-10-14 13:09:07

标签: java javafx-8

我有一个JavaFx TextArea,我从另一个线程更新文本。

/**
     * Start a new thread to update the text in the textarea. The progressmanager is called in a loop to deleiver the updated text
     */
    private void startTextAreaUpdate() {

        final Task<Void> updateTextAreaTask = new Task<Void>() {

            @Override
            protected Void call() throws Exception {

                // Start updating the progresstext
                while (!prog.getIsDone()) {
                    updateMessage(prog.getProgressText());
                    Thread.sleep(100);
                }

                return null;

            }

        };

        //Here the TextArea text is bound to the task
        taProgressText.textProperty()
                .bind(updateTextAreaTask.messageProperty());
        // Start the action in a new thread
        Thread th = new Thread(updateTextAreaTask);
        th.setDaemon(true);
        th.start();

    }

因为文本不适合textarea我总是想显示文本的最后一行。 在主线程中,我添加了一个ChangeListener。

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

    @Override
    public void changed(ObservableValue<? extends String> observable,
            String oldValue, String newValue) {
        int lastPos = taProgressText.getText().length();
        taProgressText.positionCaret(lastPos);
    }
});

然而,这个位置并没有改变。这里出了什么问题?

1 个答案:

答案 0 :(得分:0)

我认为克拉的位置发生了变化,但实际上并没有滚动。 试试这个(丑陋的黑客......)而不是绑定和当前的监听器:

updateTextAreaTask.messageProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> obs, String oldMessage, String newMessage) {
        taProgressText.setText(newMessage);
        ScrollBar scrollBar = (ScrollBar) taProgressText.lookup(".scroll-bar:vertical");
        if (scrollBar != null) {
            scrollBar.setValue(scrollBar.getMax());
        }
    }
});