JavaFX WebView 中 RadioButtons 的大小调整错误

Wrong resize of RadioButtons in JavaFX WebView

当我放大在 WebView 中打开的网页时(缩放系数 < 1.0),大部分内容都按预期缩放,但有些内容没有按预期缩放,例如单选按钮或复选框:

在上图中,第一个 WebView 未缩放,第二个 WebView 的缩放系数为 0.5,尽管单选按钮具有(或几乎)相同的大小。 这是此示例的代码:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebView;
import javafx.stage.Stage;


public class WebViewScalingDemo2 extends Application {
  @Override
  public void start(Stage stage) throws Exception {

    stage.setTitle("HTML");
    stage.setWidth(800);
    stage.setHeight(800);
    Scene scene = new Scene(new Group());
    final VBox root = new VBox();



    String html = "<html><head><meta charset=\"utf-8\"><title>Radio-Buttons definieren</title><style>"+
    "fieldset{"+ 
      "border:none;"+
    "}</style></head>"+
"<body><h1>Hier wird abkassiert!</h1><form action=\"#\"><p>Geben Sie Ihre Zahlungsweise an:</p>"+ 
    "<fieldset><input type=\"radio\" id=\"mc\" name=\"Zahlmethode\" value=\"Mastercard\"><label for=\"mc\"> Mastercard</label><br>"+ 
      "<input type=\"radio\" id=\"vi\" name=\"Zahlmethode\" value=\"Visa\"><label for=\"vi\">  Visa</label><br>"+ 
      "<input type=\"radio\" id=\"ae\" name=\"Zahlmethode\" value=\"AmericanExpress\"><label for=\"ae\"> American Express</label>"+ 
    "</fieldset></form></body></html>";

    WebView webView1 = new WebView();
    webView1.setPrefSize(300, 300);
    webView1.setLayoutX(250);
    webView1.setLayoutY(250);
    webView1.getEngine().loadContent(html);
    WebView webView2 = new WebView();
    webView2.setPrefSize(300, 300);
    webView2.setLayoutX(250);
    webView2.setLayoutY(250);
    webView2.getEngine().loadContent(html);

    root.getChildren().addAll(webView1, webView2);


    webView1.setZoom(1);
    webView2.setZoom(0.5);

    scene.setRoot(root);

    stage.setScene(scene);
    stage.show();

  }
  public static void main(String[] args) {
    launch(args);
  }
}

对我来说这是个问题,因为按钮右侧附近有标签,如果缩放系数太低,标签将部分覆盖单选按钮。

我这里有两个问题:

  1. 为什么单选按钮没有正确缩放?当使用缩放系数 > 1.0 时,它们也保持相同的大小。
  2. 我能做些什么吗?我在考虑一些 CSS 我可以在缩放比例较低时注入强制更大的间距,但这取决于使用的缩放系数,它应该是适用于所有单选按钮并检查的解决方案框,无需专门针对它们(通过 id 或样式 class)。

这是本机代码的问题,在 javafx 中使用 webkit 进行渲染并且在 Java 1.8.0_60[=29 中仍然存在=].

解决方法是自行对这些元素应用 -webkit-transform: scale(**your scale here**);

如果您不打算动态更改 zoomProperty 我建议添加 CSS 样式:

input[type="checkbox"], input[type="radio"] {
  -webkit-transform: scale(**your scale here**);
}

另一种方法是使用 javascript,如果您打算动态更改 zoomProperty,则此方法很好:

(function($){ 
   var scaleCheckboxesAndRadioButtons = function(scale) {
     var $elements= $('input[type="checkbox"], input[type="radio"]');
     $elements.css("-webkit-transform", "scale(" + scale + ")");
  }
}(jQuery));

只需在您的 webview 的 zoomProperty 上添加一个侦听器,并在更改时从您的 java 代码调用 javascript 函数:

webView.zoomProperty().addListener((observable, oldValue, newValue) -> {
  webView.getEngine().executeScript("scaleCheckboxesAndRadioButtons(" + newValue + ");");
});