簡體   English   中英

在JAVA Fx中自動更新Tableview

[英]Auto Updating Tableview in JAVA Fx

在我的項目中,當客戶端斷開連接時,服務器將從可觀察列表中刪除該名稱,並且tableview應該停止顯示該名稱。 但是tableview沒有更新。 控制器類

public class Controller {

@FXML
public TableView tableView;

@FXML
private TableColumn<clientLoginData,String> client;
@FXML
private TableColumn<clientLoginData,String> activeTime;
void initialize(ObservableList<clientLoginData> data)
{
    client.setCellValueFactory(new PropertyValueFactory<>("clientName"));
    client.setCellFactory(TextFieldTableCell.<clientLoginData>forTableColumn());
    activeTime.setCellValueFactory(new PropertyValueFactory<>("time"));
    activeTime.setCellFactory(TextFieldTableCell.<clientLoginData>forTableColumn());
    tableView.setItems(data);
    tableView.setEditable(true);

}

}

主班

public class Main extends Application{
volatile public  ObservableList<clientLoginData> data= FXCollections.observableArrayList();
public Controller controller;

@Override
public void start(Stage primaryStage) throws Exception {
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("server.fxml"));
    Parent root = loader.load();
    data.addAll(new clientLoginData((new SimpleStringProperty("john")),new SimpleStringProperty(ZonedDateTime.now().getHour()+":"+ZonedDateTime.now().getMinute())));
    controller=loader.getController();
    controller.initialize(data);
    primaryStage.setTitle("Server");
    primaryStage.setScene(new Scene(root, 600, 400));
    primaryStage.show();
    Thread t=new Thread(new messengerServer(this));
    t.start();



}

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

更新類

public class messengerReadThread implements Runnable {
private Thread thr;
private NetworkUtil nc;
public Hashtable<SimpleStringProperty, NetworkUtil> table;
SimpleStringProperty  oldName;
Main main;


public messengerReadThread(NetworkUtil nc, Hashtable<SimpleStringProperty, NetworkUtil> table, SimpleStringProperty s, Main main) {
    this.nc = nc;
    this.thr = new Thread(this);
    thr.start();
    this.table=table;
    oldName=s;
    this.main=main;
}

public void run() {

    try {
        while(true) {
            String s1=(String)nc.read();
            StringTokenizer st=new StringTokenizer(s1);
            if(st.nextToken().equals("Name"))
            {
                String sn=s1.substring(5,s1.length());
                NetworkUtil n1=table.get(oldName);
                table.remove(oldName);
                oldName=new SimpleStringProperty(sn);
                table.put(oldName, n1);
                main.data.add(new clientLoginData(oldName,new SimpleStringProperty(ZonedDateTime.now().getHour()+":"+ZonedDateTime.now().getMinute())));
            }
            else
            {
                System.out.println("here it is"+s1);
            }
        }
    } catch(Exception e) {
        System.out.println("disconnected "+oldName.toString());
        main.data.remove(oldName);
        //System.out.println(main.data.contains(oldName));

        main.controller.tableView.refresh();//the tableview should update

    }
    nc.closeConnection();
}
}

我應該對該代碼進行一些修改,例如避免使用那些“靜態引用”,方法是定義ObservableList並在Controller內移動您的Updating代碼,這樣您就可以擁有2類代碼,即Main Class和Controller ...但是我會盡量保持簡單。

首先,您需要在控制器內部定義ObservableList。

然后將您的“更新”代碼放入一個方法中的控制器中。 我建議您使用Task <>使JavaFX Thread中的控制器保持更新。

嘗試這樣的事情:

private void updateTable(){ 

    Task<Void> myUpdatingTask=new Task<Void>() {
       @Override
       protected Void call() throws Exception {
        //Your Updating Code Here
       }
    }

    //and then you run it like this:
    Thread hilo=new Thread(myUpdatingTask);
    hilo.setDaemon(true);
    hilo.start();
}

然后,從初始化方法中刪除參數,並使用@FXML注釋將其定義為私有,如下所示:

@FXML
private void initialize(){
     //Your Stuff to initialize
     //here is were you fill your table like you did in the Main
     //and don't forget to call you updateTable Method
     this.updateTable();
}

由於這是@kleopatra指出的骯臟技巧,因此我將其裝飾為骯臟技巧。 ****************************骯臟的黑客******************** *********************嘗試隱藏一列並再次顯示它,您的tableview應該刷新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM