2017-06-28 53 views
5

Stworzyłem prosty GUI, w którym mam TextArea. Sam plik TextArea zostanie zapełniony przez Array, który zawiera zeskanowane ciągi znaków z pliku .txt.Używanie dużych plików tekstowych w JavaFX (alternatywy TextArea?)

Działa to doskonale w przypadku plików o mniejszych rozmiarach. Podczas korzystania z dużych plików (~ 5MB na txt.-plik) jednak TextArea (i tylko TextArea) czuje się opóźniony i powolny (nie tak wrażliwy, jak bym chciał). Czy istnieje alternatywa dla TextArea (nie musi być w JavaFX)?

Szukam czegoś bardzo prostego, co zasadniczo pozwala uzyskać & ustawionego tekstu. Slidercontrol, jak w JavaFXTextArea, byłby bardzo przydatny.

Dziękuję i życzę udanego dnia!

Edycja: bardzo prosty przykład z mojego kodu:

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

Najwyższego kontroli danych objętość Jawa mieć „tryb wirtualne”, w celu zapewnienia tylko część danych (wymaganych rzędach). Ale nie jest to proste, np. Pobierz i ustaw –

+0

Musisz utworzyć przykład [Minimal, Complete i Verifyable] (https://stackoverflow.com/help/mcve) i opublikuj kod. – Sedrick

+0

@SedrickJefferson Oto przykład, jak opisano w wytycznej (edycja postu początkowego) – Matt

Odpowiedz

5

Na podstawie @ Matt's answer i @ SedrickJefferson's suggestion, oto pełny przykład.

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

Dzięki @SedrickJefferson Wymieniłem TextArea z ListView. Teraz działa bardzo płynnie. Poza tym zastąpię Scanner z BufferedReader, ze względu na wydajność.