gpt4 book ai didi

java - macOS 下 JavaFX WebView 的显示不正确

转载 作者:行者123 更新时间:2023-12-04 03:41:26 25 4
gpt4 key购买 nike

我们使用 JavaFX WebView 作为我们的应用内浏览器。它在 Windows 10 下运行良好。

enter image description here

但是,当我们在macOS Catalina 10.15.7下运行时,都显示gone hair wire。该应用程序在 Java 8 上运行。

enter image description here


这是我们简单的应用内浏览器的代码。

SimpleSwingBrowser.java

public class SimpleSwingBrowser extends JDialog {

private final JFXPanel jfxPanel = new JFXPanel();
private WebEngine engine;
private String loadedURL = null;
private final JPanel panel = new JPanel(new BorderLayout());

public SimpleSwingBrowser() {
super(JStock.instance(), JDialog.ModalityType.APPLICATION_MODAL);
initComponents();
}


private void initComponents() {
createScene();

// http://stackoverflow.com/questions/11269632/javafx-hmtleditor-doesnt-react-on-return-key
jfxPanel.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == 10) {
e.setKeyChar((char) 13);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(e);
}
}
});

panel.add(jfxPanel, BorderLayout.CENTER);

getContentPane().add(panel);

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-460)/2, (screenSize.height-680)/2, 460, 680);
}

private void createScene() {

Platform.runLater(new Runnable() {
@Override
public void run() {
final WebView view = new WebView();
engine = view.getEngine();

engine.titleProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SimpleSwingBrowser.this.setTitle(newValue);
}
});
}
});

engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {

@Override
public void changed(ObservableValue<? extends State> observable, State oldValue, final State newValue) {
if (newValue == FAILED) {
final int result = JOptionPane.showConfirmDialog(
panel,
MessagesBundle.getString("error_message_unable_connect_to_internet"),
MessagesBundle.getString("error_title_unable_connect_to_internet"),
JOptionPane.YES_NO_OPTION);

if (result == JOptionPane.YES_OPTION) {
if (loadedURL != null) {
engine.load(loadedURL);
}
}
}
}
});

// http://stackoverflow.com/questions/11206942/how-to-hide-scrollbars-in-the-javafx-webview
// hide webview scrollbars whenever they appear.
view.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() {
@Override
public void onChanged(Change<? extends Node> change) {
Set<Node> deadSeaScrolls = view.lookupAll(".scroll-bar");
for (Node scroll : deadSeaScrolls) {
scroll.setVisible(false);
}
}
});

jfxPanel.setScene(new Scene(view));
}
});
}

public void loadURL(final String url) {
Platform.runLater(new Runnable() {
@Override
public void run() {
String tmp = toURL(url);

if (tmp == null) {
tmp = toURL("http://" + url);
}

loadedURL = tmp;
engine.load(tmp);
}
});
}

private static String toURL(String str) {
try {
return new URL(str).toExternalForm();
} catch (MalformedURLException exception) {
return null;
}
}
}

知道为什么会这样吗?有什么我可以解决的吗?谢谢。

最佳答案

正如 this answer 中所述您可以尝试使用其他用户代理。前段时间,当我遇到与 Java 1.8.0_66 类似的问题时,我使用了以下用户代理(在 macOS 上模拟 Firefox):

webView.getEngine().setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:54.0) Gecko/20100101 Firefox/54.0");

这确实对某些网站有帮助,但并非对所有网站都有帮助(例如,谷歌地图在上述用户代理中使用了正确的字体,但由于其他问题而无法完全加载)。更新到 Java 9(当时是 9.0.1_11)得到了更好的结果。后来我尝试了以下方法:

String userAgent = this.browser.getEngine().getUserAgent();
if (userAgent != null) {
String[] parts = userAgent.split(" ");
String manipulatetUserAgent = "";
for (int i = 0; i < parts.length; i++) {
if (i > 0) {
manipulatetUserAgent += " ";
}

if (parts[i] != null && parts[i].contains("JavaFX")) {
manipulatetUserAgent += "Version/13.1.1"; // current safari version
} else {
manipulatetUserAgent += parts[i];
}
}
this.browser.getEngine().setUserAgent(manipulatetUserAgent);
}

但实际上在一个月前,我从尝试修复 JavaFX WebView 到学习如何使用 Java Chromium Embedded Framework (JCEF)这是

a simple framework for embedding Chromium-based browsers in other applications using the Java programming language.

它在集成期间当然有更多的开销,但看起来很有希望。

一开始我对 WebView 非常热情,但随着时间的推移遇到了很多错误。首先,我等待错误被修复,但随后出现了更多错误。最后让我沮丧的是登录在某些网站上无法可靠地工作(可能是因为他们使用的是 Google's reCAPTCHA )。 因此请注意,用户代理修复可能只是暂时有效(如果它能正常工作的话)。

关于java - macOS 下 JavaFX WebView 的显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65964552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com