2017-06-28 8 views
5

私はTextAreaという簡単なGUIを作成しました。 TextArea自体にはArrayが入力され、.txtファイルのスキャンされた文字列が含まれます。JavaFXで大きなtxtファイルを使用する(TextAreaの代替?)

これは、小さいサイズのファイルに最適です。しかし、大きなファイル(txt.-file〜5MB)を使用すると、TextArea(とTextAreaのみ)が遅く感じられ、遅くなります(私が望むほど反応しません)。 TextAreaJavaFXにある必要はありません)の代替品はありますか?

私は基本的には&テキストを取得することができます非常に簡単なものを探しています。 SlidercontrolJavaFXTextAreaのように、非常に便利です。

ありがとうございました。

編集:私のコードの非常に基本的な例:私はListViewTextAreaを置き換え@SedrickJeffersonへ

public class Main extends Application { 

public void start(Stage stage) { 
    Pane pane = new Pane(); 
    TextField filePath = new TextField("Filepath goes in here..."); 
    TextArea file = new TextArea("Imported file strings go here..."); 
    file.relocate(0, 60); 
    Button btnImport = new Button("Import file"); 
    btnImport.relocate(0, 30); 
    ArrayList<String> data = new ArrayList<>(); 

    btnImport.setOnAction(e -> { 
     File fileToImport = new File(filePath.getText()); 
     try { 
      Scanner scanner = new Scanner(fileToImport); 
      while(scanner.hasNextLine()) { 
       data.add(scanner.nextLine()); 
      } 
      file.setText(data.toString()); 
     } catch (FileNotFoundException e1) { 
      e1.printStackTrace(); 
     } 
    }); 

    pane.getChildren().addAll(filePath, file, btnImport); 
    Scene scene = new Scene(pane); 
    stage.setScene(scene); 
    stage.show(); 
} 

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

最も高いボリュームデータコントロールは、データの一部のみ(必要な行)を提供するために、「仮想モード」を有します。しかし、get&setのような単純なことはありません –

+0

[最小限の完全で検証可能な例](https://stackoverflow.com/help/mcve)を作成し、コードを投稿する必要があります。 – Sedrick

+0

@SedrickJeffersonここでは、ガイドライン(開始ポストの編集)に記載されている例を示します。 – Matt

答えて

5

@ Mattのanswerと@ SedrickJeffersonのsuggestionに基づいて、ここに完全な例があります。 Javaで

image

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

public class Main 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); 
     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(); 
    } 
} 
2

感謝。今は非常にスムーズに走っています。パフォーマンスのため、ScannerBufferedReaderに置き換えます。

関連する問題