2014-04-01 71 views
2

如何使JavaFX WebView內容適合窗口大小?使JavaFX WebView瀏覽器內容適合窗口

我想顯示縮放到父窗口大小的瀏覽器內容。 SetScale部分是因爲組件行爲瘋狂而縮放的瀏覽器位於父窗口的中心。顯示網站的大小始終爲1280x800,可以手動設置窗口大小。

回答

1

答案是基於這樣的:https://gist.github.com/RupprechJo/7455537

解決的辦法是把進入網頁視圖縮放窗格中,有執行內容調整大小。

它可能看起來有些slo but,但顯示了主要想法和...作品!

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; 
     } 
    } 
} 
+0

它無法調整到更大的窗口... –

1

使用「堆疊窗格」組織您的佈局。然後使用'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(); 

    } 

} 
相關問題