1. 程式人生 > >java程式通過swing呼叫javaFx更新 資料

java程式通過swing呼叫javaFx更新 資料

執行優先順序關係,java無法直接呼叫javaFx,試過通過反射等方法都不好用,最後使用SWing中轉實現和javaFx互操。

首先建立SWing呼叫javaFX類

import javafx.application.Platform;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker.State;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.TextAlignment;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import netscape.javascript.JSObject;

public class SwingSample extends JFrame {

    private final JFXPanel jfxPanel = new JFXPanel();
    private WebEngine engine;
    private Label lab = new Label("test");

    private final JPanel panel = new JPanel(new BorderLayout());
    private final JLabel lblStatus = new JLabel();

    public SwingSample() {
        super();
        initComponents();
    }

    private void initComponents() {
        createScene();
        JPanel statusBar = new JPanel(new BorderLayout(5, 0));
        statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
        statusBar.add(lblStatus, BorderLayout.CENTER);

        panel.add(jfxPanel, BorderLayout.CENTER);
        panel.add(statusBar, BorderLayout.SOUTH);
        getContentPane().add(panel);
        setPreferredSize(new Dimension(1024, 600));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

    private void createScene() {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {

                WebView view = new WebView();
                engine = view.getEngine();

                engine.getLoadWorker().stateProperty()
                        .addListener((ObservableValue<? extends State> ov, State oldState, State newState) -> {
                            if (newState == State.SUCCEEDED) {
                                JSObject win = (JSObject) engine.executeScript("window");
                                win.setMember("javaApi", new JavaApp()); // 設定介面到JavaScript中
                            }
                        });

                lab.setFont(new Font("Arial", 30));
                lab.setTextFill(Color.web("#0076a3"));
                lab.setTextAlignment(TextAlignment.JUSTIFY);
                HBox h = new HBox();
                h.getChildren().addAll(view, lab);

                jfxPanel.setScene(new Scene(h));
            }
        });
    }

    public void change(int step) {
        System.out.println("c = " + step);
        Platform.runLater(() -> lab.setText("i=" + step));
    }

    public void runJs() {
        Platform.runLater(() -> engine.executeScript("sayGoodbye('running from java')"));
    }

    public void loadURL(final String url) {
        System.out.println(url);
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                String tmp = toURL(url);

                if (tmp == null) {
                    tmp = toURL("http://" + url);
                }
                engine.load(tmp);
            }
        });
    }

    private static String toURL(String str) {
        try {
            return new URL(str).toExternalForm();
        } catch (MalformedURLException exception) {
            return null;
        }
    }

    public class JavaApp {

        public void exit() {
            Platform.exit();
        }

        public String getData(String data) {
            System.out.println(data);
            return "hi " + data ;
        }
        
        public double setDate(double data) {
            System.out.println(data);
            return data * 10;
        }

        public String getJson() {
            return "{\"msg\":\"查詢 成功!\",\"code\":0,\"data\":{\"isOK\":true,\"code\":\"100\"}}";
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                SwingSample browser = new SwingSample();
                browser.setVisible(true);
                browser.loadURL(getClass().getResource("help.html").toExternalForm());
            }
        });
    }

}

建立html頁面

<html lang="en">
    <head>
        <script type="text/javascript">
        
            function setDate(data)  {
                document.getElementById("my_message").innerHTML = data;
            }
            
            function getData(data)  {
                var  message  = javaApi.getData(data);
                document.getElementById("my_message").innerHTML = message;
            }
            
            function getJson()  {
                var  json  = javaApi.getJson();
                document.getElementById("my_json").innerHTML = json;
            }
            function getJsonObj()  {
                var  json  = JSON.parse(javaApi.getJson()); 
                document.getElementById("my_json2").innerHTML = json.code;
            }
            
        </script>
    </head>
    <body>
        <h1>javafx import java </h1>
     <p><a href="about:blank" onclick="javaApi.exit()">Exit the Application</a></p>
     <button onclick="getJson()">getJson</button>
     <button onclick="getJsonObj()">getJsonObj</button>
     <button onclick="javaApi.setDate(20)">setDateJava</button>
     <button onclick="javaApi.getData('js')">getDataJava</button>
     <button onclick="getData('js')">getDataJs</button>
     <div  id="my_message"></div>
     <div  id="my_list"></div>
     <div  id="my_json"></div>
     <div  id="my_json2"></div>
    </body>
</html>



最後編寫測試java程式

import java.util.concurrent.TimeUnit;
import javax.swing.SwingUtilities;

public class Test {

	public static int tm = 100;
	static SwingSample browser = new SwingSample();

	public static void main(String[] args) {
		runSwing();
		task();
	}

	public static void runSwing() {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				browser.setVisible(true);
				browser.loadURL(SwingSample.class.getResource("help.html").toExternalForm());
			}
		});
	}

	public static void task() {
		new Thread(() -> {
			int i = 0;
			while (i++ < 10) {
				try {
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(i);
				work(i);
			}
			browser.runJs();
		}).start();
	}

	public static void work(int i) {
		browser.change(i);
	}

}

java程式呼叫javaFx方法更新 javaFX,可以把java程式計算的結果實時顯示在javaFx上。

使用SWing中轉可以方便的隨時呼叫javaFX,畫圖,表格等 視覺化功能。

相關推薦

java程式通過swing呼叫javaFx更新 資料

執行優先順序關係,java無法直接呼叫javaFx,試過通過反射等方法都不好用,最後使用SWing中轉實現和javaFx互操。首先建立SWing呼叫javaFX類import javafx.application.Platform; import javafx.beans.v

java程式通過 pdf模板 新增pdf表單資料並列印

1:用adobe acrobat設定pdf的表單屬性 第二步:寫java程式 package document.pdf; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; imp

為什麼很多Java程式設計師都轉行做大資料了?

如今大資料發展的越來越成熟。各大企業紛紛成立大資料部門。尤其BAT等一線網際網路公司每天處理的資料量都是TB級別。大資料部門已成為這些企業的核心部門,資料已成為企業最核心的資產。 但是大資料人才缺口巨大,據統計目前全國的大資料人才僅46萬,未來3-5年內大資料人才的缺口將高達150萬。 因此大資料工程師薪

Java程式設計師,想嘗試大資料資料探勘,該怎麼規劃學習?

  一.大資料方向工作介紹 二.大資料工程師的技能要求 三.大資料學習路徑 四.學習資源推薦(書籍、部落格、網站)   一.大資料方向工作介紹 大資料方向的工作目前分為三個主要方向: 01.大資料工程師 02.資料分析師 03.大資料科學家 04.其他(資料探勘本

JAVA程式碼 通過Socket讀取返回的資料

                 package net.java2000.net;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.InetAdd

微信小程式通過api介面將json資料展現到小程式示例

實現知乎客戶端的一個重要知識前提就是,要知道怎麼通過知乎新聞的介面,來把資料展示到微信小程式端上。  那麼我們這一就先學習一下,如何將介面獲取到的資料展示到微信小程式上。  1.用到的知識點 <1> wx.request 請求介面資源(微信小程式api中的發

微信小程式通過api介面將json資料展現

輪播圖 <view> <swiper indicator-dots="{{indicatorDots}}" autoplay="{{autoplay}}" class="banners" interval="{{interval}}" duration="{{durat

Java程式通過JDBC連線遠端資料庫MySQL

程式碼如下: import java.sql.*; public class jdbc { @SuppressWarnings("unused") public static void main

JAVA後臺通過http呼叫簡訊API

來自一個剛勉強脫離小白的程式猿分享 由於專案中需要呼叫到一個簡訊驗證介面,所以就開始了漫漫長尋找免費介面之路,然而幾個小時無果,轉念一想就試試能不能用,隨便一個能用一下就好,然後找到一個可以免費用20次的介面,不多說,直接上鍊接https://wx.jcloud.com/g

node通過路由呼叫方法將資料返回前端

首先講一下我的需求,如圖 三個input標籤,輸入地址,埠,點選按鈕,採集資料 首先使用express搭建node框架,使用的是ejs模板 1、寫方法 定義一個方法collect,最後將其暴露出去 module.exports=collect,一定不

Java程式設計師在用的大資料工具

問題:他們最近一年最喜歡用什麼工具或者是框架? 受訪者可以選擇列表中的選項或者列出自己的,本文主要關心的是大資料工具。上一篇Java調查包括下列內容: 開發語言Web框架應用伺服器資料庫工具SQL資料大資料開發工具雲供應商 現在,來看看維基百科上對大資料的定義: 大資

java通過JNA呼叫dll JNI的替代者—使用JNA訪問Java外部功能介面

---恢復內容開始--- 1. JNA簡單介紹 先說JNI(Java Native Interface)吧,有過不同語言間通訊經歷的一般都知道,它允許Java程式碼和其他語言(尤其C/C++)寫的程式碼進行互動,只要遵守呼叫約定即可。首先看下JNI呼叫C/C++的過程,注意寫程式時自下而上,呼叫時自上而下

Java程式中讀寫windows共享資料

摘要 使用Java通過JCIFS框架讀寫共享資料夾,使用SMB協議,並支援域認證。 專案常常需要有訪問共享資料夾的需求,例如讀取共享資料夾儲存的視訊、照片和PPT等檔案。那麼如何使用Java讀寫Windows共享資料夾呢? 使用Java訪問擁有全部讀寫許可權的共享資料夾比較簡單,和普通的目錄沒有什麼區別。

PB程式通過http呼叫servlet

1、準備pslib21.dll 2、得到http url 3、傳送http請求 4、得到返回值 eg: instance variables: constant string is_HttpIP = '192.168.0.97' constant string is_Ht

使用Java程式一次分段讀取所有資料(如海量資料)並計數處理

前段時間遇到一個問題,很簡單就是定時任務刪除資料庫中三個月前的資料;無非就是delete...from...where;當時的需求要考慮這幾個問題: 1.效率 2.一次讀取全部 3.保留部分資料 先說一下當時的需求,刪除三個月前的動態(團隊動態),但有些團隊的動

Java程式通過LDAP對使用者進行登陸驗證

       在去年南京專案中,客戶方要求使用者登陸需要在其他平臺下進行認證,當時客戶用的LDAP“資料庫”管理方式,後來查閱Java已經對LDAP進行了封裝,不需要下載其他jar包就可以實現。        補腦:【LDAP】是"Lightweight Directory

Java通過jdbc呼叫oracle儲存過程

Java呼叫Oracle儲存過程步驟主要分為三類: (1)編寫Oracle儲存過程 (2)編寫資料庫獲取連線工具類 (3)編寫簡單應用呼叫儲存過程 1、Oracle中的儲存過程程式 1.在Oracle SQL Developer中建立儲存過程 在sc

idea中通過java程式直接呼叫python檔案

專案用python開發時大量引入了外包,當需要在java中使用該程式碼時考慮要麼轉成java語言(太麻煩),要麼打包成jar(沒找到合適的方法),參考了一些java呼叫python檔案方法,並不適合我目前開發的環境,下面給出idea下直接呼叫的方法。 一、在i

微信小程式——省市縣三級聯動,實時通過後臺呼叫PHP程式碼獲取資料

由於專案頻繁用到三級聯動,比如地區、時間、分類,這些網路上不能滿足,所以我們通過後臺呼叫的方式來實現 後臺我使用的是PHP語言 目錄結構: |-client |---pages |-----index |-------index.js //包含初始化資料和呼叫後臺的資料,

Android開發 通過JNI實現JAVA與C/C++程式間的呼叫和回撥

       在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互呼叫。        Java Native Interface (JNI)標準是java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行