Java 为手风琴添加动态标题窗格

Java 为手风琴添加动态标题窗格,java,swing,javafx,accordion,Java,Swing,Javafx,Accordion,所以我正在创建一个程序来获取swagger doc.json,提取所有REST API,然后将其显示在手风琴中:问题是手风琴对我不起作用,因为标题窗格是动态添加的:即:对于从JSON文件中提取的每个REST API端点,将显示一个新的标题窗格 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入java.net.MalformedURLException; 导入java.net.URL; 导入java.util.Map

所以我正在创建一个程序来获取swagger doc.json,提取所有REST API,然后将其显示在手风琴中:问题是手风琴对我不起作用,因为
标题窗格
是动态添加的:即:对于从
JSON
文件中提取的每个REST API端点,将显示一个新的
标题窗格

导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.Map;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JTextField;
导入io.swagger.models.HttpMethod;
导入io.swagger.models.Operation;
导入io.swagger.models.Path;
导入io.swagger.models.Response;
导入io.swagger.models.swagger;
导入io.swagger.models.parameters.Parameter;
导入io.swagger.parser.SwaggerParser;
导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.control.TitledPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类GroupOfTitledPane扩展了应用程序{
JFrame框架;
jtextfieldt1;
JButton-btn;
int i;
@凌驾
公共作废开始(最后阶段){
frame=新的JFrame();
frame.setLayout(空);
框架。设置尺寸(400250);
帧设置位置(500300);
t1=新的JTextField();
t1.立根(60,40270,30);
帧。添加(t1);
btn=新按钮(“提交”);
btn.立根(140,90100,30);
帧添加(btn);
frame.setVisible(true);
btn.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(如getSource()==btn)
{
字符串输入=t1.getText();
if(input.isEmpty()| | input.equals(“”)
{
showMessageDialog(null,“Veuillez saisir l'address de l'URL”);
}
否则{
URL urldoc=null;
试一试{
urldoc=新URL(输入);
} 
捕获(格式错误的异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
字符串url=新字符串(“https://”+urldoc.getAuthority()+“/v2/swagger.json”);
System.out.println(url);
Swagger-Swagger=newswaggerparser().read(url);
Map path=swagger.getpath();
//创建根窗格。
VBox root=新的VBox();
根.坐垫(新的插图(20,10,10,10));
对于(Map.Entry p:path.entrySet()){
路径路径=p.getValue();
映射操作=path.getOperationMap();
for(java.util.Map.Entry o:operations.entrySet()){
System.out.println(“=”);
System.out.println(“路径:+p.getKey());
System.out.println(“Http方法:+o.getKey());
System.out.println(“摘要:+o.getValue().getSummary());
System.out.println(“参数编号:+o.getValue().getParameters().size());
对于(参数:o.getValue().getParameters()){
System.out.println(“-”+参数.getName());
}
System.out.println(“响应:”);
对于(Map.Entry r:o.getValue().getResponses().entrySet()){
System.out.println(“-”+r.getKey()+”:“+r.getValue().getDescription());
}           
//创建第一个标题窗格。
TitledPane firstTitledPane=新的TitledPane();
firstTitledPane.setText((o.getKey()).toString()+”:“+(p.getKey()).toString());
VBox content1=新的VBox();
content1.getChildren().add(新标签(“JavaSwing教程”);
content1.getChildren().add(新标签(“JavaFx教程”);
content1.getChildren().add(新标签(“JavaIO教程”);
firstTitledPane.setContent(content1);
root.getChildren().addAll(第一标题窗格);
场景=新场景(根,300,200);
舞台场景;
stage.show();
}
}
}
}
}
});
}
公共静态void main(字符串[]args){
应用程序启动(args);
}
} 
下面是错误:

https://petstore.swagger.io/v2/swagger.json 0 [AWT-EventQueue-0] INFO io.swagger.parser.Swagger20Parser - reading from https://petstore.swagger.io/v2/swagger.json
=== PATH:/pet/{petId} Http method:GET Summary:Find pet by ID Parameters number: 1
 - petId Responses:
 - 200: successful operation
 - 400: Invalid ID supplied
 - 404: Pet not found Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: 
   Not on FX application thread; currentThread = AWT-EventQueue-0   
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279)     
atcom.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:444)   at javafx.stage.Window.setShowing(Window.java:939)  at javafx.stage.Window.show(Window.java:955)    at javafx.stage.Stage.show(Stage.java:259)  at GroupOfTitledPane$1.actionPerformed(GroupOfTitledPane.java:102)  at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)   at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)   at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)   at javax.swing.DefaultButtonModel.setPressed(Unknown Source)    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)     at java.awt.Component.processMouseEvent(Unknown Source)     at javax.swing.JComponent.processMouseEvent(Unknown Source)     at java.awt.Component.processEvent(Unknown Source)  at java.awt.Container.processEvent(Unknown Source)  at java.awt.Component.dispatchEventImpl(Unknown Source)     at java.awt.Container.dispatchEventImpl(Unknown Source)     at java.awt.Component.dispatchEvent(Unknown Source)     at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)     at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)     at java.awt.Container.dispatchEventImpl(Unknown Source)     at java.awt.Window.dispatchEventImpl(Unknown Source)    at java.awt.Component.dispatchEvent(Unknown Source)     at java.awt.EventQueue.dispatchEventImpl(Unknown Source)    at java.awt.EventQueue.access$500(Unknown Source)   at java.awt.EventQueue$3.run(Unknown Source)    at java.awt.EventQueue$3.run(Unknown Source)    at java.security.AccessController.doPrivileged(Native Method)   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)    at java.awt.EventQueue$4.run(Unknown Source)    at java.awt.EventQueue$4.run(Unknown Source)    at java.security.AccessController.doPrivileged(Native Method)   at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)    at java.awt.EventQueue.dispatchEvent(Unknown Source)    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)  at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)     at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)  at java.awt.EventDispatchThread.pumpEvents(Unknown Source)  at java.awt.EventDispatchThread.pumpEvents(Unknown Source)  at java.awt.EventDispatchThread.run(Unknown Source)

不要混合使用swing和fx,除非你必须这样做!如果是这种情况,您必须非常小心地满足这两种线程规则,即仅在fx应用程序线程上更改scenegraph(错误告诉您,您正在这里进行Violtain)和仅在fx应用程序线程上更改swing层次结构EDT@kleopatra有什么方法可以同时使用它们吗?或者有没有办法只用摇摆来创作手风琴?因为我显然是JavaFX的初学者,我不知道如何处理它?我显然是JavaFX的初学者,所以更不应该混用:)要么全力以赴(从基础教程开始,练习以获得自信),要么坚持swing(在那里)