将JavaFX WebView浏览器内容安装到窗口

将JavaFX WebView浏览器内容安装到窗口,java,webview,javafx,Java,Webview,Javafx,如何使JavaFXWebView内容适合窗口大小 我想显示按父窗口大小缩放的浏览器内容SetScale之所以能起到一定的作用,部分原因是组件行为疯狂,缩放浏览器位于父窗口的中心。显示站点的大小始终为1280x800,可以手动设置窗口大小。答案基于此: 解决方案是将WebView放入缩放窗格,然后在其中执行内容大小调整 它可能看起来有点邋遢,但显示了主要思想和。。。工作 package webscale; import java.awt.BorderLayout; import java.awt

如何使JavaFXWebView内容适合窗口大小

我想显示按父窗口大小缩放的浏览器内容
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())