如何在后续调用之间关闭javafx和swing窗口线程?

如何在后续调用之间关闭javafx和swing窗口线程?,javafx,exit,Javafx,Exit,下面是一个模拟从网站提取数据的功能类。问题是如何在检索数据后关闭窗口和线程?错误消息是 Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Platform.exit has been called On line: final JFXPanel fxPanel = new JFXPanel() { 这是代码。在指定位置插入Platform.exit()时,会发生上述错误。在实际代码中,javafx用

下面是一个模拟从网站提取数据的功能类。问题是如何在检索数据后关闭窗口和线程?错误消息是

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Platform.exit has been called
On line:  final JFXPanel fxPanel = new JFXPanel() {
这是代码。在指定位置插入Platform.exit()时,会发生上述错误。在实际代码中,javafx用于获取和扫描html文本。另外,javafx用于在服务器上设置属性和在服务器上启动程序,两者都是使用java脚本完成的。javafx功能已从这个演示使用Platform.exit()时发生的错误的最小示例中删除

公共类Step11a{
公共静态void main(字符串[]args)引发ParseException、InterruptedException{
步骤11a st=新步骤11a();
st.getData();
st.getData();
}
专用JTable表;
私有字符串url;
私有网络视图;
公共步骤11a(){
url=”https://www.tsp.gov/investmentfunds/shareprice/sharePriceHistory.shtml";
table=新的JTable();
}
私有场景创建场景(ArrayBlockingQueue平台队列){
StackPane root=新的StackPane();
场景=新场景(根);
webView=新建webView();
WebEngine WebEngine=webView.getEngine();
Worker=webEngine.getLoadWorker();
worker.stateProperty().addListener((可观察到的o)->{
if(worker.getState()==worker.State.successed){
DefaultTableModel tableDataModel=(DefaultTableModel)table.getModel();
//以下步骤已删除,以获取最简单的示例
//1)从服务器获取html代码
//2)定位要修改的图元
//3)创建javascript字符串以修改元素值
//4)执行javascript更新elemetns
//5)执行javascript启动服务器上的数据检索
//6)获取html并提取数据表
//对于本例,我们只设置行和列
//在桌子上
tableDataModel.setColumnCount(11);
tableDataModel.setRowCount(24);;
试一试{
platfromQueue.put(tableDataModel);
}捕获(例外e){
e、 printStackTrace();
}
}
});
加载(url);
root.getChildren().add(webView);
返回场景;
}
私有DefaultTableModel initAndShowGUI(){//此方法在EDT线程上调用
JFrame=新JFrame(“WebViewTable”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JFXPanel fxPanel=新JFXPanel(){
私有静态最终长serialVersionUID=1L;
@凌驾
公共维度getPreferredSize(){
返回新尺寸(800400);
}
};
frame.add(fxPanel,BorderLayout.CENTER);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
ArrayBlockingQueue platformQueue=新的ArrayBlockingQueue(5);
Platform.runLater(()->{
initFX(fxPanel,platformQueue);
});
DefaultTableModel tspData=null;
试一试{
tspData=platformQueue.take();
}捕获(例外e){
e、 printStackTrace();
}
//Platform.exit();//此位置导致下次调用时出错
//最终JFXPanel fxPanel=new JFXPanel()上发生错误{
返回tspData;
}
私有void initFX(JFXPanel fxPanel,ArrayBlockingQueue platformQueue){
//此方法在JavaFX线程上调用
//System.out.println(“JavaFx线程名”+thread.currentThread().getName());
场景=创建场景(平台队列);
fxPanel.setScene(场景);
}
私有DefaultTableModel getData(){
ArrayBlockingQueue swingQueue=新的ArrayBlockingQueue(5);
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
DefaultTableModel tspDataLocal=initAndShowGUI();
swingQueue.put(tspDataLocal);
}catch(java.lang.ArrayIndexOutOfBoundsException e){
e、 printStackTrace();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
});
DefaultTableModel tableJFrameData=null;
试一试{
tableJFrameData=swingQueue.take();
}捕捉(中断异常e){
e、 printStackTrace();
}
//Platform.exit();//此位置导致下次调用时出错
//最终JFXPanel fxPanel=new JFXPanel()上发生错误{
返回tableJFrameData;
}
}

代码太多,但是如果您想关闭JavaFX应用程序线程,可以打电话给我几分钟,我将用一个简单的示例修改代码,并指出我在哪里尝试了Platform.exit().好的,我在两个位置添加了platform.exit,这对我来说是有意义的,但在这两个位置,它都会在下一次迭代中导致错误。你能创建一个并将其添加到你的问题中吗?在我看来,JavaFX在这方面做得太过火了。你可以使用这样的库使事情变得非常简单。
public class Step11a {

    public static void main(String[] args) throws ParseException, InterruptedException {
        Step11a st = new Step11a();
        st.getData();
        st.getData();
    }


    private JTable table;
    private String url;
    private WebView webView;
    public Step11a() {
        url = "https://www.tsp.gov/investmentfunds/shareprice/sharePriceHistory.shtml";
        table = new JTable();
    }
    private Scene createScene(ArrayBlockingQueue<DefaultTableModel> platfromQueue) {
        StackPane root = new StackPane();
        Scene scene = new Scene(root);
        webView = new WebView();
        WebEngine webEngine = webView.getEngine();
        Worker<Void> worker = webEngine.getLoadWorker();
        worker.stateProperty().addListener((Observable o) -> {
            if (worker.getState() == Worker.State.SUCCEEDED) {
                DefaultTableModel tableDataModel = (DefaultTableModel) table.getModel();
                // Following steps deleted for minimal example
                // 1) Get html code from server
                // 2) Locate elements to modify
                // 3) Create javascript string to modify element values
                // 4) Execute javascript to update elemetns
                // 5) Execute javascript to start data retrieval on server
                // 6) Get html and extract table of data
                // For this example, we just set the rows and columns 
                // in the table
                tableDataModel.setColumnCount(11);
                tableDataModel.setRowCount(24);;
                try {
                    platfromQueue.put(tableDataModel);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        webEngine.load(url);
        root.getChildren().add(webView);
        return scene;
    }

    private DefaultTableModel initAndShowGUI() {    // This method is invoked on the EDT thread
        JFrame frame = new JFrame("WebViewTable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JFXPanel fxPanel = new JFXPanel() {
            private static final long serialVersionUID = 1L;
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(800, 400);
            }
        };
        frame.add(fxPanel, BorderLayout.CENTER);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        ArrayBlockingQueue<DefaultTableModel> platformQueue = new ArrayBlockingQueue<DefaultTableModel>(5) ;
        Platform.runLater(() -> {
            initFX(fxPanel,platformQueue);
        });
        DefaultTableModel tspData = null;
        try {
            tspData = platformQueue.take();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Platform.exit();   // At this location causes error on next call
        // error occurs on final JFXPanel fxPanel = new JFXPanel() {
        return tspData;
    }

    private void initFX(JFXPanel fxPanel, ArrayBlockingQueue<DefaultTableModel> platformQueue) {
        // This method is invoked on the JavaFX thread
        //      System.out.println("JavaFx thread name "+Thread.currentThread().getName());
        Scene scene = createScene(platformQueue);
        fxPanel.setScene(scene);
    }

    private DefaultTableModel getData() {
        ArrayBlockingQueue<DefaultTableModel> swingQueue = new ArrayBlockingQueue<>(5);

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    DefaultTableModel tspDataLocal = initAndShowGUI( );
                    swingQueue.put(tspDataLocal);
                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        DefaultTableModel tableJFrameData = null;
        try {
            tableJFrameData = swingQueue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // Platform.exit();   // At this location causes error on next call
        // error occurs on final JFXPanel fxPanel = new JFXPanel() {

        return tableJFrameData;
    }
}