有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Javafx webview在运行时不显示dashplotly应用程序

我正在尝试将Dash plotly应用程序集成到Java应用程序中

我创建了一个Plotly Dash应用程序,如下所示:

代码中的Dash app组件如下所示:

app = dash.Dash(__name__)

##image_filename = 'tmp.png' # replace with your own image
##encoded_image = base64.b64encode(open(image_filename, 'rb').read())

styles = {
    'pre': {
        'border': 'thin lightgrey solid',
        'overflowX': 'scroll'
    }
}


app.layout = html.Div([
    html.Div([
        html.Div([
            dcc.Graph(id='basic-interactions', figure=fig)
        ], className="seven columns"),

        html.Div([
             dcc.Markdown("""
                **Node Details**

                Click node to view details here.
            """),
            html.Pre(id='click-data', style={"maxHeight": "500px", "overflow": "scroll"}),
        ], className="four columns"),
    ], className="row")
])

@app.callback(
    Output('click-data', 'children'),
    Input('basic-interactions', 'clickData'))
def display_click_data(clickData):
    mydict = ast.literal_eval('{}'.format(clickData))
    if mydict!=None:
        print_clicked = mydict['points'][0]['text']
        for i in full_texts:
            if print_clicked == i[0]:
                print_clicked = i[1]

        if '<br>' in print_clicked:
            print_clicked = print_clicked.replace('<br>','\n')
        if '<b>' in print_clicked:
            print_clicked = print_clicked.replace('<b>','**')
        if '</b>' in print_clicked:
            print_clicked = print_clicked.replace('</b>','**')
        return print_clicked


if __name__ == '__main__':
    app.run_server(host='127.0.0.1',port=8050,debug=True)

我还创建了一个Java程序,它接收用户输入,并使用JavaFXWebView面板在Java应用程序中显示Dash应用程序

代码的javafx组件如下所示:

private void setGraph(JPanel pane, String title) throws Exception
{
    pane.removeAll();
    JFXPanel jfxPanel = new JFXPanel();
    pane.setLayout(new BorderLayout());
    pane.add(jfxPanel,BorderLayout.CENTER);
    Platform.runLater(() -> {
        StackPane root = new StackPane();
        Scene scene = new Scene(root);
        WebView webView = new WebView();
        WebEngine webEngine = webView.getEngine();
        
        boolean result=false;
        while(result==false) {
            try {
                ServerSocket serverSocket = new ServerSocket(8050);
                result=true;
            } catch (IOException e) {
                System.out.println("Could not listen on port: " + 8050);
                // ...
            }
        }
        if (result ==true) {
             webEngine.load("http://127.0.0.1:8050");
             root.getChildren().add(webView);
             jfxPanel.setScene(scene);
        }
        
    });
    pane.updateUI();
        
}

但是,当我第一次运行Java代码时,在http://127.0.0.1:8050创建的Dash应用程序不会显示。(不过,Dash应用程序可以在普通的chrome浏览器上看到)

当我第二次运行Java代码时,Dash应用程序会出现,只是因为在第一次运行中启动的Dash应用程序没有终止。

我已经验证了Java程序的Javafx面板段在构建Dash应用程序的Python代码运行之后运行

我的问题:

  1. 我不确定为什么在我第一次运行代码时它不显示Dash应用程序,以及如何解决它

  2. 如何在每次执行程序时终止Dash应用程序

我在这上面呆了太久了。。。如有任何建议,将不胜感激


共 (0) 个答案