JavaFX 8初始化方法

时间:2015-07-14 05:27:44

标签: java javafx-8

所以我正在尝试使用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才会加载,但在程序关闭之前它不会完成。谷歌搜索后,我找不到任何解决方案。我需要一种方法来调用一个方法来完成所有这些,在初始化方法完成后。我的客户端类与此类似,但是当单击登录按钮时,在事件上激活连接的方法。对于这个服务器端,我试图在没有与用户进行任何交互的情况下开始。那么有一种方法可以在初始化方法运行后调用方法或使其工作吗?

1 个答案:

答案 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的方法时才有效。