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" οnclick="javaApi.exit()">Exit the Application</a></p>
<button οnclick="getJson()">getJson</button>
<button οnclick="getJsonObj()">getJsonObj</button>
<button οnclick="javaApi.setDate(20)">setDateJava</button>
<button οnclick="javaApi.getData('js')">getDataJava</button>
<button οnclick="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,畫圖,表格等 視覺化功能。
相關文章
- javafx 和swing_整合JavaFX和SwingJava
- 整合JavaFX和SwingJava
- 在JavaFX程式中嵌入Swing內容Java
- java通過url呼叫遠端介面返回json資料JavaJSON
- 打算學GUI程式設計,SWING,javaFx,SWT怎麼選?GUI程式設計Java
- javafx和swing巢狀使用的方法Java巢狀
- laravel 通過 rpc 呼叫 golang 程式LaravelRPCGolang
- Java的GUI框架如何選擇? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot?JavaGUI框架GoApache
- 通過EFCore呼叫GBase8s資料庫儲存過程資料庫儲存過程
- java Swing程式設計入門Java程式設計
- Node.js通過Dubbo2.js呼叫JavaNode.jsJava
- Java-GUI 程式設計之 SwingJavaGUI程式設計
- SQL Server通過建立臨時表遍歷更新資料SQLServer
- Java-GUI程式設計之Swing元件JavaGUI程式設計元件
- Java學習之Swing Gui程式設計JavaGUI程式設計
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- Java開發桌面程式學習(九)——JavaFxTemplate JavaFx模版 更簡單進行JavaFx程式開發Java
- 4.5 通過SRVCTL 呼叫Oracle RestartOracleREST
- 通過 Swoole\Table 實現 Swoole 多程式資料共享
- Java的JDBC通過SSH Tunnel連線MySQL資料庫JavaJDBCMySql資料庫
- 使用JAVA呼叫配方單儲存介面更新資料失敗, 使用了SaveParam引數Java
- PHP通過FFI呼叫CJieba分詞PHPJieba分詞
- JS呼叫本地exe(通過URL Protocol)JSProtocol
- MyBatis(八) 資料庫BLOB讀寫、批量更新操作、儲存過程呼叫、分表、分頁MyBatis資料庫儲存過程
- Java Swing坦克小遊戲Java遊戲
- 《java程式設計基礎》javaFX的佈局皮膚Java程式設計
- MySQL 通過 binlog 恢復資料MySql
- 2.3 通過DBCA建立資料庫資料庫
- indexedDB 通過索引查詢資料Index索引
- 通過duplicat恢復資料庫資料庫
- 通過Web API查詢資料WebAPI
- 在小程式後端中轉獲取介面資料,繞過前端呼叫限制後端前端
- 好程式設計師Java教程解讀什麼是swing程式設計師Java
- 如何通過資料管理影響資料質量
- Mysql資料庫是如何通過索引定位資料MySql資料庫索引
- 通過Vue的過濾器實現資料的資料脫敏Vue過濾器
- Java11 & JavaFX 初體驗 - Java 程式碼生成 Markdown 的小工具Java