2017-08-13 32 views
0

我想在javafx中做一個tableview,它可以實時顯示我添加的行,我的目標是編寫一個程序,它可以將表中的行逐行導入,我嘗試了下面的代碼:如何在JavaFx中顯示TableView中的即時更改?

public class Controller implements Initializable { 


@FXML 
private TableView<Logs> table; 
@FXML 
private TableColumn<Logs, Integer> numCol; 
@FXML 
private TableColumn<Logs, Integer> nameCol; 
@FXML 
private TableColumn<Logs, String> familyCol; 
@FXML 
private TableColumn<Logs, String> JobCol; 

private int num = 1; 
private List<Logs> listLogs = new ArrayList(); 
private ObservableList<Logs> observableListlogs; 

public Controller() { 
} 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    numCol.setCellValueFactory(new PropertyValueFactory<Logs, Integer>("num")); 
    nameCol.setCellValueFactory(new PropertyValueFactory<Logs, Integer>("name")); 
    familyCol.setCellValueFactory(new PropertyValueFactory<Logs, String>("family")); 
    jobCol.setCellValueFactory(new PropertyValueFactory<Logs, String>("job")); 

    observableListlogs = FXCollections.observableArrayList(listLogs); 

    table.setItems(observableListlogs); 

} 

@FXML 
private void captureEvents() { 


    ProcessBuilder builder = new ProcessBuilder(
      "cmd.exe", "/c", "cd \"C:\\Users\\a\\Desktop\\users\"&& user.exe"); 
    builder.redirectErrorStream(true); 

    try { 
     Process p = builder.start(); 
     BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line ; 
     int lineNumber=1; 
     while (true) { 

      line = r.readLine(); 

      if (line==null) 
        break; 
      parseLine(line); 

     } 
    } catch (Exception e) { 

     e.printStackTrace(); 
    } 

} 

private void parseLine(String line) { 


    Pattern p = Pattern.compile("<name>(.*?)</name><family>(.*?)</family><Job>(.*?)</Job> 
    Pattern p1 = Pattern.compile("<exceed>(.*?)</exceed>"); 

    Matcher m = p.matcher(line); 

    Matcher m1 = p1.matcher(line); 
    if (m.find()) { 

     try { 


       Logs log = new Logs(num++, m.group(1).toString(), 
        m.group(2).toString(), m.group(3).toString()); 
         observableListlogs.add(log)); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } else 
     if (m1.find()) { 

      try{ 

        Logs log = new Logs(num++, m1.group(1)); 
        observableListlogs.add(log)); 


      }catch (Exception e){ 

       e.printStackTrace(); 
      } 

    } 
} 

}

但不幸的是我沒有看到,直到一些異常的的tableView的內容(我用我自己讓我可以看到的tableView的內容,應用程序被鎖定,直到發生異常)(我的意思是,當行添加到表中時,它不會一一顯示我,在異常發生後它會突然顯示錶視圖的所有內容,我需要以實時方式向我顯示內容e) 我應該怎麼做才能在表格視圖中看到即時更改?

回答

0

你做阻止你的主線程:

while (true) { 
    line = r.readLine(); 
    if (line==null) 
     break; 
    parseLine(line); 
} 

主線程(或UI線程)用於渲染用戶界面。如果你通過一些繁重的計算或IO來阻止它,你將會遇到framedrops甚至像你的情況一樣凍結。您需要在後臺線程上執行您的IO代碼,以便您的主線程可以自由執行UI更新。

一個簡單的解決方法,把事情現在你可以簡單地把你的代碼放到一個新的線程並啓動它的工作:

@FXML 
private void captureEvents() { 

    Thread thread = new Thread(() -> { 
     ProcessBuilder builder = new ProcessBuilder(
      "cmd.exe", "/c", "cd \"C:\\Users\\a\\Desktop\\users\"&& user.exe"); 
     builder.redirectErrorStream(true); 

     try { 
      Process p = builder.start(); 
      BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line ; 
      int lineNumber=1; 
      while (true) { 

       line = r.readLine(); 

       if (line==null) 
        break; 
       parseLine(line); 

      } 
     } catch (Exception e) { 

      e.printStackTrace(); 
     } 
    }); 
    thread.start(); 
} 

這將啓動一個新的後臺線程,將執行你的任務。您可能希望以某種工作線程的方式執行此任務,但作爲一種快速解決方案,它可以解決您的問題。

+0

感謝您的及時回覆,請您詳細解釋一下嗎?或給我一些例子,我該如何解決這個問題 – ATA

+0

@ATA檢查更新 – JohnnyAW

相關問題