使用TextArea使用JavaFX编辑大型文本文件

时间:2017-09-24 03:58:00

标签: java javafx javafx-8

有没有办法在TextArea中合理地快速编辑一个相对较大的文本文件(例如10-25 MB)?或者可能有一些功能可以禁用,以使其更快?有替代组件吗? (我知道RichTextFX,但我想它会慢一些,因为它做得更多,我只需要一个基本的编辑器。)

我宁愿不将源文本分成更小的部分,只加载一部分文本,因为这样会破坏文本选择+复制(即。"选择全部"只会选择加载的文本而不是整个文件的文本。

1 个答案:

答案 0 :(得分:3)

一种方法是利用flyweight提供的ListView渲染来创建行编辑器。从此example开始,下面的LineEditor可通过设置SelectionMode.MULTIPLE来进行多项选择。它还可以通过here进行编辑,如@tarrsalah所示。当然,您需要添加其他控件以满足您的特定用例。

image

import java.io.*;
import javafx.application.*;
import javafx.collections.*;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

/** @see https://stackoverflow.com/a/44823611/230513 */
public class LineEditor extends Application {

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

    @Override
    public void start(Stage stage) {
        VBox pane = new VBox();
        Button importButton = new Button("Import");
        TextField filePath = new TextField("/usr/share/dict/words");
        ObservableList<String> lines = FXCollections.observableArrayList();
        ListView<String> listView = new ListView<>(lines);
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        listView.setCellFactory(TextFieldListCell.forListView());
        listView.setOnEditCommit(new EventHandler<ListView.EditEvent<String>>() {
            @Override
            public void handle(ListView.EditEvent<String> t) {
                listView.getItems().set(t.getIndex(), t.getNewValue());
            }
        });
        listView.setEditable(true);
        importButton.setOnAction(a -> {
            listView.getItems().clear();
            try {
                BufferedReader in = new BufferedReader
                    (new FileReader(filePath.getText())); 
                String s;
                while ((s = in.readLine()) != null) {
                    listView.getItems().add(s);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        pane.getChildren().addAll(importButton, filePath, listView);
        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.show();
    }
}