【发布时间】:2016-03-02 20:28:19
【问题描述】:
所以我正在为服务器控制器创建一个带有 JavaFX 的 UI,这并不重要,重要的是 server.getClients();返回 IClient 的 ArrayList。
我希望在 ListView 中显示这些客户端(它们由 IP 表示,但再一次,这似乎不相关)。但是,客户端可以在任何给定时间点连接,当这种情况发生时,它们会被添加到服务器的 IClient ArrayList 中。更新此列表时,我希望 ListView 刷新并显示新客户端。出于某种原因,我根本无法让它工作。
我对 JavaFX 很陌生,我想我可能正在监督一些事情。 如果这是重复或明显的,我很抱歉,在过去的几天里我已经搜索了很长时间,但我可能忽略了一个解决方案。
以下代码是我的 FXMLController 用于 JavaFX 应用程序的缩写版本:
/*imports*/
public class FXMLController implements Initializable {//serverUI.FXMLController
@FXML private ListView clientListView;
/*some more (irrelevant) code*/
private IServer server;
/*some more (irrelevant) code*/
private ObservableList<IClient> serverClientsObservableList;
@Override
public void initialize(URL url, ResourceBundle rb) {
System.out.println("initialization...");
/*some more (irrelevant) code*/
//the server was started here
// FXML Controls
initClientListView();
/*some more (irrelevant) code*/
System.out.println("initialized");
}
/*some more (irrelevant) code*/
private void initClientListView() {
System.out.println("clientListView");
serverClientsObservableList = FXCollections.observableList(server.getClients());
serverClientsObservableList.addListener(new ListChangeListener<IClient>() {
@Override
public void onChanged(ListChangeListener.Change<? extends IClient> change) {
System.out.println("list change detected");
//is any of the followin three lines really necessary to update the ListView content?
serverClientsObservableList.setAll(server.getClients());
clientListView.setItems(null);
clientListView.setItems(serverClientsObservableList);
}
});
clientListView.setItems(serverClientsObservableList);
}
/*some more (irrelevant) code*/
}
编辑:
当 IClients 中的某些内容发生变化时,我不想刷新 ListView,它们没有任何变化。当一个新的 IClient 添加到服务器的客户端列表时,我想刷新 ListView。 ListView 应该显示 NEW IClient
EDIT2:
根据建议的副本,我尝试了以下操作,但是我并不真正了解它在做什么以及它是如何工作的。这并没有解决问题,当我尝试创建新的 Observable[]
时它给了我一个错误Callback<IClient, Observable[]> extractor = new Callback<IClient, Observable[]>() {
@Override
public Observable[] call(IClient c) {
return new Observable[] {c.getNameProperty()};
}
};
ObservableList<IClient> clientOList = FXCollections.observableArrayList(extractor);
另外:我将客户端添加到服务器的代码。 长话短说,这是一个任务,我们必须以相反的方式使用 RMI,服务器命令客户端。客户端将自己注册到服务器列表中,然后将它们添加到 IClient 列表中。
package serviceImplementation;
import commandService.ICommand;
import commandServiceImplementation.CommandResult;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import service.IClient;
import service.IServer;
public class ServerService extends UnicastRemoteObject implements IServer {
private ArrayList<IClient> clients;
public ServerService() throws RemoteException {
clients = new ArrayList<>();
}
@Override
public boolean register(IClient client) throws RemoteException {
if(!clients.contains(client)) {
clients.add(client);
return true;
}
return false;
}
@Override
public boolean unRegister(IClient client) throws RemoteException {
if(clients.contains(client)) {
clients.remove(client);
return true;
}
return false;
}
@Override
public String ping() throws RemoteException {
long arrival = System.currentTimeMillis();
System.out.println("Got pinged at [" + arrival + "]");
return ("server ponged [" + arrival + "]");
}
@Override
public CommandResult sendCommand(ICommand command, IClient targetClient) throws RemoteException {
if(clients.contains(targetClient)) {
return clients.get(clients.indexOf(targetClient)).executeCommand(command);
}
return null;
}
@Override
public ArrayList<IClient> getClients() {
return clients;
}
}
【问题讨论】:
-
您是否尝试过在 Stack Overflow 上搜索该主题?几乎可以肯定之前有人问过。
-
我搜索了 Stack Overflow,确实找到了建议的重复项,但我无法让它工作。
-
显示将新客户端添加到列表的代码。你名单上的听众真的什么都没做。
-
@James_D 我添加了代码并解释了一点,我试图让问题保持简单以避免混淆,但更好的解释并没有什么坏处。也感谢您澄清我的听众的无用