所以我正在尝试使用JavaFX为GUI做一个聊天类型的程序。我有它所以一个充当服务器的类将循环并继续添加客户端连接。
public void serverconnection()
{
// portnumber was saved from constructor
try (ServerSocket socket = new ServerSocket(this.portnumber))
{
// loop is a bool set to true
while (loop)
{
// this class extends Thread and has its own overwritten start method
new myclass(socket.accept()).start();
}
}
catch (IOException e)
{
System.exit(404);
}
}
所以问题是(我假设)是,这个循环一直循环直到程序关闭。但是因为我在JavaFX的初始化方法中调用它
public void initialize(URL url, ResourceBundle rb)
{
// constructor, nothing here is needed for this post
myclass z = new myclass(45234);
// problem here, since this has a loop, but
z.serverconnection();
// gui wont load till after this is done
// but serverconnection is only done after program ends
}
显然,问题是,在初始化完成后,GUI才会加载,但在程序关闭之前它不会完成。谷歌搜索后,我找不到任何解决方案。我需要一种方法来调用一个方法来完成所有这些,在初始化方法完成后。我的客户端类与此类似,但是当单击登录按钮时,在事件上激活连接的方法。对于这个服务器端,我试图在没有与用户进行任何交互的情况下开始。那么有一种方法可以在初始化方法运行后调用方法或使其工作吗?
答案 0 :(得分:1)
您可能希望在一个线程中运行此循环,所以执行类似
的操作Thread t = new Thread(z::serverconnection)
t.start()
如果您在initialization()
方法结束时执行此操作,则会完全运行。
这将启动一个永远运行的线程;您可能希望在程序应该终止时添加一个用于中断线程的功能。
请记住,要更改GUI中的任何内容,您需要通过Platform.runLater()
汇总任务。这是因为GUI只能在该一个线程内进行修改。因此,为了修改任何内容,您必须将其包装在Runnable中并提交以供执行。
你可以这样做:
Platform.runLater(new Runnable() {
@Override
public void run() {
doWhateverNeedsToBeDone();
}
});
在Java 8中,您可以执行以下任何操作,具体取决于要完成的工作范围:
Platform.runLater(() -> {
doWhateverNeedsToBeDone();
});
Platform.runLater(() -> doWhateverNeedsToBeDone());
Platform.runLater(this::doWhateverNeedsToBeDone);
后者仅在doWhateverNeedsToBeDone()
是this
的方法时才有效。