日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

在Swing和Swt中使用JavaFX

發(fā)布時間:2023/12/3 java 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Swing和Swt中使用JavaFX 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自??在Swing和Swt中使用JavaFX

本人從08年12月份,JavaFX發(fā)布第一個版本開始關(guān)注它的發(fā)展。

?算算到現(xiàn)在,也差不多是第五個年頭了。期間經(jīng)歷了一些動蕩,但JavaFX還是堅持著發(fā)展了下來,也經(jīng)歷了很多改變(這也是Java技術(shù)的特點,不會像微軟對技術(shù)的拋棄和更新?lián)Q代很頻繁),由以前順應(yīng)富互聯(lián)網(wǎng)技術(shù)發(fā)展的單純的JavaFX腳本語言,到現(xiàn)在已經(jīng)變?yōu)橥耆糜谌〈鶶wing的技術(shù)。

??

?雖然是為了取代Swing,但任何的技術(shù)為了不造成很大的影響,都必須有一個逐步換代的過程。如果單純的從JDK中剔除Swing而增加JavaFX的話,將會造成世界數(shù)不清的程序無法運行,影響不可估量(就像JDK中有很多以前不合理的舊的類庫,就算有新的可替代的方案,也不能將以前的完全刪除,所以JDK其實越來越臃腫)。這里,我們將會介紹一下如何在Swing中使用JavaFX。

? 首先我們要明白,不管是Swing還是JavaFX,GUI的構(gòu)建必須要各自的EDT(事件分發(fā)線程)中進行,這也是在其他線程中操作UI會出現(xiàn)error的原因。

? 而在JavaFX中,新增加了JFXPanel。這個組件是JavaFX和Swing進行混合編程的橋梁。

? 下面我們來看看JFXPanel的繼承關(guān)系。

??

??大家可以看到,JFXPanel是繼承于JComponent的。而JavaFX的UI控件都是繼承于javafx.scene.control.Control。所以很明顯,它其實是一個Swing組件,而非JavaFX的組件。

? 下面我們來看看JPanel的繼承關(guān)系。

??

? 繼承關(guān)系基本相同,也就是說,凡是在使用JPanel的地方,我們都可以用JFXPanel來替代。JFXPanel中有一個setScene方法,可以設(shè)置其中顯示的JavaFX內(nèi)容。

? 根據(jù)文檔介紹,setScene方法可以在Swing和JavaFX的EDT中使用。也可以說,setScene才是將JavaFX和Swing結(jié)合起來的關(guān)鍵。

? 不過由于JavaFX的GUI的構(gòu)建也需要在JavaFX的事件分發(fā)線程中進行。所以我們還需要用到另外一個類Platform。

? Platform.runLater(new Runnable())中間執(zhí)行的是JavaFX的事件分發(fā)線程。我們可以在Runnable中進行JavaFX的UI的創(chuàng)建。

? 下面我們來看一個簡單的示例-----在Swing中嵌入一個JavaFX的網(wǎng)頁瀏覽器。

??

import java.awt.BorderLayout; import java.awt.Toolkit;import javafx.application.Platform; import javafx.embed.swing.JFXPanel; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView;import javax.swing.JFrame;public class MainClass {private static final int WIDTH = 800;private static final int HEIGHT = 600;private static final String url = "http://blog.csdn.net/ml3947";private static final String urlStart = "http://";/*** @param args*/public static void main(String[] args) {JFrame frame = new JFrame("JavaFX in Swing");final JFXPanel webBrowser = new JFXPanel();frame.setLayout(new BorderLayout());frame.add(webBrowser, BorderLayout.CENTER);Platform.runLater(new Runnable() {@Overridepublic void run() {Group root = new Group();Scene scene = new Scene(root, WIDTH, HEIGHT);webBrowser.setScene(scene);Double widthDouble = new Integer(WIDTH).doubleValue();Double heightDouble = new Integer(HEIGHT).doubleValue();VBox box = new VBox(10);HBox urlBox = new HBox(10);final TextField urlTextField = new TextField();urlTextField.setText(url);Button go = new Button("go");urlTextField.setPrefWidth(WIDTH - 70);urlBox.getChildren().addAll(urlTextField, go);WebView view = new WebView();view.setMinSize(widthDouble, heightDouble);view.setPrefSize(widthDouble, heightDouble);final WebEngine eng = view.getEngine();eng.load(url);root.getChildren().add(view);box.getChildren().add(urlBox);box.getChildren().add(view);root.getChildren().add(box);go.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent event) {if (!urlTextField.getText().startsWith(urlStart)) {eng.load(urlStart + urlTextField.getText());} else {eng.load(urlTextField.getText());}}});}});int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(WIDTH, HEIGHT);frame.setLocation((screenWidth - WIDTH) / 2, (screenHeight - HEIGHT) / 2);frame.setVisible(true);}}

? 這是一個很簡單的例子。

? 我們創(chuàng)建了JFrame和JFXPanel,然后在Platform.runLater中進行Scene的創(chuàng)建,并設(shè)置到JFXPanel中。

? 我們創(chuàng)建了一個Textfield用來輸入網(wǎng)址,創(chuàng)建了一個JavaFX Button來跳轉(zhuǎn)到網(wǎng)址。判斷網(wǎng)址是不是http://開頭并做簡單的處理。

? 下面看看運行效果:

??

? 如圖所示。

? ?另外,在Swt中使用的話是JFXCanvas,由于實現(xiàn)機制的問題,我們并不需要像在Swing中使用Platform類。而JFXCanvas也是org.eclipse.swt.widgets.Canvas的直接子類,我們可以直接使用。

? 示例如下:

public class JFXInSwt {private static Scene createScene() {Group group = new Group();Scene scene = new Scene(group);Button button = new Button("JFX Button");group.getChildren().add(button);return scene;}public static void main(String[] args) {Display display = new Display();Shell shell = new Shell(display);shell.setLayout(new FillLayout());FXCanvas canvas = new FXCanvas(shell, SWT.NONE);Scene scene = createScene();canvas.setScene(scene);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) display.sleep();}display.dispose();}}

總結(jié)

以上是生活随笔為你收集整理的在Swing和Swt中使用JavaFX的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。