一 背景
swing可以編寫一個(gè)桌面程序,只要機(jī)器上裝有jre即可打開。那么swing中是否可以嵌入web頁面呢?
二 JavaFX方式實(shí)例
在Swing中嵌入一個(gè)JavaFX的網(wǎng)頁瀏覽器
import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.io.File;
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 Main {
private static final int WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;
private static final int HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height;
private static final String url = "http://www.baidu.com";
private static final String urlStart = "http://";
/**
* @param args
*/
public static void main(String[] args) {
JFrame frame = new JFrame("嵌入瀏覽器");
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 - 80);
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);
}
}
三 效果
這是一個(gè)很簡(jiǎn)單的例子。
我們創(chuàng)建了JFrame和JFXPanel,然后在Platform.runLater中進(jìn)行Scene的創(chuàng)建,并設(shè)置到JFXPanel中。
我們創(chuàng)建了一個(gè)Textfield用來輸入網(wǎng)址,創(chuàng)建了一個(gè)JavaFX Button來跳轉(zhuǎn)到網(wǎng)址。判斷網(wǎng)址是不是http://開頭并做簡(jiǎn)單的處理。
下面看看運(yùn)行效果:

效果圖.png