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
- javafx內嵌為Swing程式淺析Java
- 利用JavaFX功能豐富Swing應用程式Java
- Java的Swing應用中使用JavaFX的功能Java
- java通過url呼叫遠端介面返回json資料JavaJSON
- 在Swing和Swt中使用JavaFXJava
- 打算學GUI程式設計,SWING,javaFx,SWT怎麼選?GUI程式設計Java
- javafx和swing巢狀使用的方法Java巢狀
- 通過Java程式測試資料庫連線資訊Java資料庫
- SWing事件呼叫事件
- laravel 通過 rpc 呼叫 golang 程式LaravelRPCGolang
- 11.2通過資料庫鏈呼叫10.2過程報錯資料庫
- java通過jdbc連結資料庫JavaJDBC資料庫
- 用 Phoenix 通過 SQL 語句更新操作 HBase 資料SQL
- Java的GUI框架如何選擇? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot?JavaGUI框架GoApache
- Help:swing thin client呼叫EJB,怎麼過防火牆?client防火牆
- 通過EFCore呼叫GBase8s資料庫儲存過程資料庫儲存過程
- SQL Server通過建立臨時表遍歷更新資料SQLServer
- Node.js通過Dubbo2.js呼叫JavaNode.jsJava
- Python通過ctypes呼叫C程式例項PythonC程式
- java Swing程式設計入門Java程式設計
- Java SwingJava
- JavaFX教程-更新觸發器Java觸發器
- 借JavaFX之風,Swing終於熬到了出頭之日Java
- 使用Java通過POI讀取EXCEL中的資料JavaExcel
- java通過相對路徑讀取properties資料Java
- Java-GUI 程式設計之 SwingJavaGUI程式設計
- java swing的drag and drop源程式 (轉)Java
- 4.5 通過SRVCTL 呼叫Oracle RestartOracleREST
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- Java的JDBC通過SSH Tunnel連線MySQL資料庫JavaJDBCMySql資料庫
- Java開發桌面程式學習(九)——JavaFxTemplate JavaFx模版 更簡單進行JavaFx程式開發Java
- 通過 Swoole\Table 實現 Swoole 多程式資料共享
- 儲存過程呼叫不同資料庫的資料儲存過程資料庫
- Java-GUI程式設計之Swing元件JavaGUI程式設計元件
- Java學習之Swing Gui程式設計JavaGUI程式設計