2017-08-13 34 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

相关问题