微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javafx webview 在运行时不显示 dash-plotly 应用程序

如何解决Javafx webview 在运行时不显示 dash-plotly 应用程序

我正在尝试将 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 程序,该程序接受用户输入并使用 javafx WebView 面板在 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 应用没有显示。 (尽管可以在普通的 chrome 浏览器上看到 Dash 应用程序)

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

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

我的问题:

  1. 我不确定为什么我第一次运行代码时它没有显示 Dash-app 以及如何解决它...

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

我已经坚持了太久......任何建议将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?