如何在后续调用之间关闭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;
}
}