在Swing和Swt中使用JavaFX
本人從08年12月份,JavaFX釋出第一個版本開始關注它的發展。
算算到現在,也差不多是第五個年頭了。期間經歷了一些動盪,但JavaFX還是堅持著發展了下來,也經歷了很多改變(這也是Java技術的特點,不會像微軟對技術的拋棄和更新換代很頻繁),由以前順應富網際網路技術發展的單純的JavaFX指令碼語言,到現在已經變為完全用於取代Swing的技術。
雖然是為了取代Swing,但任何的技術為了不造成很大的影響,都必須有一個逐步換代的過程。如果單純的從JDK中剔除Swing而增加JavaFX的話,將會造成世界數不清的程式無法執行,影響不可估量(就像JDK中有很多以前不合理的舊的類庫,就算有新的可替代的方案,也不能將以前的完全刪除,所以JDK其實越來越臃腫)。這裡,我們將會介紹一下如何在Swing中使用JavaFX。
首先我們要明白,不管是Swing還是JavaFX,GUI的構建必須要各自的EDT(事件分發執行緒)中進行,這也是在其他執行緒中操作UI會出現error的原因。
而在JavaFX中,新增加了JFXPanel。這個元件是JavaFX和Swing進行混合程式設計的橋樑。
下面我們來看看JFXPanel的繼承關係。
下面我們來看看JPanel的繼承關係。
繼承關係基本相同,也就是說,凡是在使用JPanel的地方,我們都可以用JFXPanel來替代。JFXPanel中有一個setScene方法,可以設定其中顯示的JavaFX內容。
根據文件介紹,setScene方法可以在Swing和JavaFX的EDT中使用。也可以說,setScene才是將JavaFX和Swing結合起來的關鍵。
不過由於JavaFX的GUI的構建也需要在JavaFX的事件分發執行緒中進行。所以我們還需要用到另外一個類Platform。
Platform.runLater(new Runnable())中間執行的是JavaFX的事件分發執行緒。我們可以在Runnable中進行JavaFX的UI的建立。
下面我們來看一個簡單的示例-----在Swing中嵌入一個JavaFX的網頁瀏覽器。
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() {
@Override
public 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>() {
@Override
public 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);
}
}
這是一個很簡單的例子。
我們建立了JFrame和JFXPanel,然後在Platform.runLater中進行Scene的建立,並設定到JFXPanel中。
我們建立了一個Textfield用來輸入網址,建立了一個JavaFX Button來跳轉到網址。判斷網址是不是http://開頭並做簡單的處理。
下面看看執行效果:
如圖所示。
另外,在Swt中使用的話是JFXCanvas,由於實現機制的問題,我們並不需要像在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();
}
}
---------------------------------------------------------------------------------------
很不幸,由於Sourceforge的專案首頁貌似被遮蔽了,就算我繫結了自己的一個一級域名...也是有時可以訪問有時不能訪問,所以示例不準備放在上面了。過一段時間買個空間自己建個站。
---------------------------------------------------------------------------------------
相關文章
- javafx 和swing_整合JavaFX和SwingJava
- 打算學GUI程式設計,SWING,javaFx,SWT怎麼選?GUI程式設計Java
- 在JavaFX程式中嵌入Swing內容Java
- 整合JavaFX和SwingJava
- javafx和swing巢狀使用的方法Java巢狀
- Java的GUI框架如何選擇? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot?JavaGUI框架GoApache
- JAVA SWING/AWT/SWT DEVELOPER WANTEDJavaDeveloper
- Java的Swing應用中使用JavaFX的功能Java
- IBM實驗室對SWT, Swing 和 AWT 的特徵比較IBM特徵
- javafx內嵌為Swing程式淺析Java
- 利用JavaFX功能豐富Swing應用程式Java
- 免費的swing/swt視覺化開發工具windowbuilder視覺化UI
- java程式通過swing呼叫javaFx更新 資料Java
- 在NetBeans IDE中使用JavaFXBeanIDEJava
- 借JavaFX之風,Swing終於熬到了出頭之日Java
- JavaFx WebView使用研究JavaWebView
- 如何使用JavaFX和GraalVM建立移動App?JavaLVMAPP
- 在 Windows 和 Mac 的網頁上喚起 JavaFX 應用WindowsMac網頁Java
- 基於SWT的類XUL實現: SWT-XUIUI
- [Java Swing] 在mac中不顯示java的dock iconJavaMac
- 瞭解JavaFX 和 PythonJavaPython
- JavaFx ObservableList的使用詳解Java
- 常用SWT元件(六)元件
- JavaFX教程-字串和字串表示式Java字串
- 使用 JavaFX 構建 Reactive 系統JavaReact
- JAVAFXJava
- 簡單的list介面和edit介面使用java swing實現Java
- 在Linux中,如何配置和使用Xen?Linux
- JavaFX教程-廣度(Extents)和列舉Java
- 『出錯』在eclipse3.0下用ant來build一個使用了swt的工程失敗EclipseUI
- swing
- 在Ubuntu中安裝Docker和docker的使用UbuntuDocker
- Java在Swing中如何實現彈出一個對話方塊的效果?Java
- 相容SWING和HTML的解決方案HTML
- JavaFX教程-增量式求值和懶惰求值Java
- Java圖形化:Swing表格的使用Java
- JavaFx Tooltip懸浮提示使用及自定義Java
- 在 PBootCMS 中,使用 {php} 和 {eval} 標籤可以在模板中執行 PHP 程式碼bootPHP