将JavaFX WebView浏览器内容安装到窗口
如何使JavaFXWebView内容适合窗口大小 我想显示按父窗口大小缩放的浏览器内容将JavaFX WebView浏览器内容安装到窗口,java,webview,javafx,Java,Webview,Javafx,如何使JavaFXWebView内容适合窗口大小 我想显示按父窗口大小缩放的浏览器内容SetScale之所以能起到一定的作用,部分原因是组件行为疯狂,缩放浏览器位于父窗口的中心。显示站点的大小始终为1280x800,可以手动设置窗口大小。答案基于此: 解决方案是将WebView放入缩放窗格,然后在其中执行内容大小调整 它可能看起来有点邋遢,但显示了主要思想和。。。工作 package webscale; import java.awt.BorderLayout; import java.awt
SetScale
之所以能起到一定的作用,部分原因是组件行为疯狂,缩放浏览器位于父窗口的中心。显示站点的大小始终为1280x800,可以手动设置窗口大小。答案基于此:
解决方案是将WebView放入缩放窗格,然后在其中执行内容大小调整
它可能看起来有点邋遢,但显示了主要思想和。。。工作
package webscale;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javafx.application.Platform;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Scale;
import javafx.scene.web.WebView;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class WebScale extends JApplet {
static ZoomingPane zoomingPane;
private static JFXPanel fxContainer;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame("JavaFX 2 in Swing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new WebScale();
applet.init();
frame.setContentPane(applet.getContentPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
applet.start();
frame.addComponentListener(new java.awt.event.ComponentAdapter() {
@Override
public void componentResized(java.awt.event.ComponentEvent evt) {
if (zoomingPane != null) {
zoomingPane.setZoomFactors((double)(frame.getWidth()/ 1280.0), (double)(frame.getHeight() / 800.0));
}
}
});
}
});
}
@Override
public void init() {
fxContainer = new JFXPanel();
fxContainer.setPreferredSize(new Dimension(300, 200));
add(fxContainer, BorderLayout.CENTER);
// create JavaFX scene
Platform.runLater(new Runnable() {
@Override
public void run() {
createScene();
}
});
}
private void createScene() {
WebView webView = new WebView();
zoomingPane = new ZoomingPane(webView);
BorderPane bp = new BorderPane();
bp.setCenter(zoomingPane);
fxContainer.setScene(new Scene(bp));
webView.getEngine().load("http://google.pl");
}
private class ZoomingPane extends Pane {
Node content;
private final DoubleProperty zoomFactor = new SimpleDoubleProperty(1);
private double zoomFactory = 1.0;
private ZoomingPane(Node content) {
this.content = content;
getChildren().add(content);
final Scale scale = new Scale(1, 1);
content.getTransforms().add(scale);
zoomFactor.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
scale.setX(newValue.doubleValue());
scale.setY(zoomFactory);
requestLayout();
}
});
}
@Override
protected void layoutChildren() {
Pos pos = Pos.TOP_LEFT;
double width = getWidth();
double height = getHeight();
double top = getInsets().getTop();
double right = getInsets().getRight();
double left = getInsets().getLeft();
double bottom = getInsets().getBottom();
double contentWidth = (width - left - right)/zoomFactor.get();
double contentHeight = (height - top - bottom)/zoomFactory;
layoutInArea(content, left, top,
contentWidth, contentHeight,
0, null,
pos.getHpos(),
pos.getVpos());
}
public final Double getZoomFactor() {
return zoomFactor.get();
}
public final void setZoomFactor(Double zoomFactor) {
this.zoomFactor.set(zoomFactor);
}
public final void setZoomFactors(Double zoomFactorx, Double Zoomfactory) {
this.zoomFactory = Zoomfactory;
this.zoomFactor.set(zoomFactorx);
}
public final DoubleProperty zoomFactorProperty() {
return zoomFactor;
}
}
}
packagewebscale;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入javafx.application.Platform;
导入javafx.beans.property.DoubleProperty;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.embed.swing.JFXPanel;
导入javafx.geometry.Pos;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.Pane;
导入javafx.scene.transform.Scale;
导入javafx.scene.web.WebView;
导入javax.swing.JApplet;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
公共类WebScale扩展了JApplet{
静态缩放窗格缩放窗格;
私有静态JFXPanel fxContainer;
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
最终JFrame=新的JFrame(“JavaFX2在Swing中”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet=新的WebScale();
applet.init();
frame.setContentPane(applet.getContentPane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
applet.start();
frame.addComponentListener(新的java.awt.event.ComponentAdapter(){
@凌驾
public void ComponentResistized(java.awt.event.ComponentEvent evt){
如果(缩放窗格!=null){
setZoomFactors((double)(frame.getWidth()/1280.0),(double)(frame.getHeight()/800.0));
}
}
});
}
});
}
@凌驾
公共void init(){
fxContainer=newjfxpanel();
setPreferredSize(新维度(300200));
添加(fxContainer,BorderLayout.CENTER);
//创建JavaFX场景
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
createScene();
}
});
}
私有void createScene(){
WebView WebView=新建WebView();
zoomingPane=新的zoomingPane(webView);
BorderPane bp=新的BorderPane();
设置中心(缩放窗格);
fxContainer.setScene(新场景(bp));
webView.getEngine().load(“http://google.pl");
}
私有类缩放窗格扩展窗格{
节点内容;
private final DoubleProperty zoomFactor=新的SimpleDoubleProperty(1);
私人双zoomFactory=1.0;
专用缩放窗格(节点内容){
this.content=内容;
getChildren().add(内容);
最终刻度=新刻度(1,1);
content.getTransforms().add(scale);
zoomFactor.addListener(新的ChangeListener(){
@凌驾
公共无效已更改(ObservalEvalue使用“堆栈窗格”组织布局。然后使用“Rectangle2D primaryScreenBounds=Screen.getPrimary().getVisualBounds();”获取用户窗口尺寸
package com.ruemerc;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class MainWindow extends Application{
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
WebView webview = new WebView();
StackPane stackPane=new StackPane();
stackPane.getChildren().add(webview);
WebEngine webEngine= webview.getEngine();
webEngine.setJavaScriptEnabled(true);
webEngine.load("http://www.ruemerc.co.ke/apps/smsgateway");
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>() {
public void changed(@SuppressWarnings("rawtypes") ObservableValue ov, Worker.State oldState, Worker.State newState) {
if(newState.toString().equals("FAILED")){
webEngine.loadContent("<!DOCTYPE html><html><head><title>Page Title</title></head><body>"
+ "<h1>Error:</h1>"
+ "<p>Internet connection Problem.</p>" +"<button onclick=\"window.location.href='http://www.ruemerc.co.ke/apps/smsgateway/'\">Retry</button>"
+ "</body></html>");
}
}
});
Scene scene=new Scene(stackPane);
primaryStage.setTitle("Ruemerc SMS");
primaryStage.getIcons().add(new Image("images/logoedtrack.png"));
primaryStage.setScene(scene);
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
//set Stage boundaries to visible bounds of the main screen
primaryStage.setX(primaryScreenBounds.getMinX());
primaryStage.setY(primaryScreenBounds.getMinY());
primaryStage.setWidth(primaryScreenBounds.getWidth());
primaryStage.setHeight(primaryScreenBounds.getHeight());
primaryStage.show();
}
}
package com.ruemerc;
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.concurrent.Worker;
导入javafx.geometry.Rectangle2D;
导入javafx.scene.scene;
导入javafx.scene.image.image;
导入javafx.scene.layout.StackPane;
导入javafx.scene.web.WebEngine;
导入javafx.scene.web.WebView;
导入javafx.stage.Screen;
导入javafx.stage.stage;
公共类主窗口扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(Stage primaryStage)引发异常{
WebView WebView=新建WebView();
StackPane StackPane=新的StackPane();
stackPane.getChildren().add(webview);
WebEngine WebEngine=webview.getEngine();
setJavaScriptEnabled(true);
webEngine.load(“http://www.ruemerc.co.ke/apps/smsgateway");
webEngine.getLoadWorker().stateProperty().addListener(
新的ChangeListener(){
public void已更改(@SuppressWarnings(“rawtypes”)observeValue ov,Worker.State oldState,Worker.State newState){
如果(newState.toString().equals(“失败”){
webEngine.loadContent(“页面标题”
+“错误:”
+“Internet连接问题。”+“重试”
+ "");
}
}
});
场景=新场景(stackPane);
primaryStage.setTitle(“Ruemerc SMS”);
添加(新图像(“images/logoedtrack.png”);
初级阶段。场景(场景);
矩形2D primaryScreenBounds=Screen.getPrimary().getVisualBounds();
//将舞台边界设置为主屏幕的可见边界
setX(primaryScreenBounds.getMinX());
setY(primaryScreenBounds.getMinY());
primaryStage.setWidth(primaryScreenBounds.getWidth())