如何使JavaFX web浏览器显示警报和确认消息
我的java web浏览器不显示警报(“消息”);并确认(“信息”);或者,我通常使用c#web浏览器组件,它工作得很好,但我在这方面是新手如何使JavaFX web浏览器显示警报和确认消息,java,javafx,webbrowser-control,Java,Javafx,Webbrowser Control,我的java web浏览器不显示警报(“消息”);并确认(“信息”);或者,我通常使用c#web浏览器组件,它工作得很好,但我在这方面是新手 public void openPage(String url){ JFXPanel jfxPanel = new JFXPanel(); JFrame frame = new JFrame(""); frame.add(jfxPanel); Platform.runLater(() -> { Web
public void openPage(String url){
JFXPanel jfxPanel = new JFXPanel();
JFrame frame = new JFrame("");
frame.add(jfxPanel);
Platform.runLater(() -> {
WebView webView = new WebView();
jfxPanel.setScene(new Scene(webView));
webView.getEngine().load(url);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
});
}
对于
警报
,请向web引擎注册。对于确认,在web引擎中注册a。请参阅的“用户界面回调”部分
下面是一个简单的例子:
import java.util.Optional;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
public class WebViewWithAlertAndConfirm extends Application {
private WebEngine engine;
@Override
public void start(Stage primaryStage) {
WebView webView = new WebView();
engine = webView.getEngine();
engine.setOnAlert(event -> showAlert(event.getData()));
engine.setConfirmHandler(message -> showConfirm(message));
String content =
"<html>"
+ "<head>"
+ "<script language='javascript'>"
+ "function doConfirm() {"
+ " var accepted = confirm('Are you sure?');"
+ " if (accepted) {"
+ " document.getElementById('result').innerHTML = 'Accepted';"
+ " } else {"
+ " document.getElementById('result').innerHTML = 'Declined';"
+ " }"
+ "}"
+ "</script>"
+ "<body>"
+ "<div><button onclick='alert(\"This is an alert!\")'>Show alert</button>"
+ "<button onclick='doConfirm()'>Confirm</button>"
+ "</div>"
+ "<div id='result'/>"
+ "</body>"
+ "</html>";
engine.loadContent(content);
primaryStage.setScene(new Scene(new BorderPane(webView)));
primaryStage.show();
}
private void showAlert(String message) {
Dialog<Void> alert = new Dialog<>();
alert.getDialogPane().setContentText(message);
alert.getDialogPane().getButtonTypes().add(ButtonType.OK);
alert.showAndWait();
}
private boolean showConfirm(String message) {
Dialog<ButtonType> confirm = new Dialog<>();
confirm.getDialogPane().setContentText(message);
confirm.getDialogPane().getButtonTypes().addAll(ButtonType.YES, ButtonType.NO);
boolean result = confirm.showAndWait().filter(ButtonType.YES::equals).isPresent();
// for debugging:
System.out.println(result);
return result ;
}
public static void main(String[] args) {
launch(args);
}
}
import java.util.Optional;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.ButtonType;
导入javafx.scene.control.Dialog;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.web.WebEngine;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
带有AlertandConfirm的公共类WebView扩展了应用程序{
私有网络引擎;
@凌驾
公共无效开始(阶段primaryStage){
WebView WebView=新建WebView();
engine=webView.getEngine();
engine.setOnAlert(事件->显示警报(event.getData());
engine.setConfirmHandler(消息->显示确认(消息));
字符串内容=
""
+ ""
+ ""
+“函数doConfirm(){”
+“var accepted=confirm('您确定吗?');”
+“如果(接受){”
+“document.getElementById('result')。innerHTML='Accepted'
+“}否则{”
+“document.getElementById('result')。innerHTML='defeed'
+ " }"
+ "}"
+ ""
+ ""
+“显示警报”
+“确认”
+ ""
+ ""
+ ""
+ "";
引擎。加载内容(content);
设置场景(新场景(新边框窗格(webView));
primaryStage.show();
}
私有void showAlert(字符串消息){
对话框警报=新建对话框();
alert.getDialogPane().setContentText(消息);
alert.getDialogPane().getButtonTypes().add(ButtonType.OK);
alert.showAndWait();
}
私有布尔showConfirm(字符串消息){
对话框确认=新建对话框();
确认.getDialogPane().setContentText(消息);
确认.getDialogPane().getButtonTypes().addAll(ButtonType.YES,ButtonType.NO);
布尔结果=confirm.showAndWait().filter(ButtonType.YES::equals).isPresent();
//对于调试:
系统输出打印项次(结果);
返回结果;
}
公共静态void main(字符串[]args){
发射(args);
}
}
我找到了一个很好的解决方案:)
有关警报:
webView.getEngine().setOnAlert(new EventHandler<WebEvent<String>>(){
@Override
public void handle(WebEvent<String> arg0) {
JOptionPane.showMessageDialog(null, arg0.getData(),"Mensaje", JOptionPane.INFORMATION_MESSAGE);
}
});
webView.getEngine().setOnAlert(新的EventHandler()){
@凌驾
公共无效句柄(WebEvent arg0){
showMessageDialog(null,arg0.getData(),“Mensaje”,JOptionPane.INFORMATION_MESSAGE);
}
});
确认:
webView.getEngine().setConfirmHandler(new Callback<String, Boolean>() {
public Boolean call(String msg) {
int result = JOptionPane.showConfirmDialog(null,msg, "Mensaje",JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
boolean b = (result != 0);
return !b;
}});
webView.getEngine().setConfirmHandler(新回调函数(){
公共布尔调用(字符串消息){
int result=JOptionPane.showConfirmDialog(null,消息,“Mensaje”,JOptionPane.OK\u CANCEL\u选项,JOptionPane.INFORMATION\u消息);
布尔b=(结果!=0);
返回!b;
}});
您不应该在FX应用程序线程上创建作业窗格。此代码将挂起在某些系统上(例如Mac上)。我不想使用Stage,也不想我的类扩展应用程序,所以不要。你仍然可以在我的回答中使用处理程序,不是吗?(只需删除对stage的引用,不要调用initOwner
)如果要使用JOptionPane
,则需要正确执行它,并通过SwingUtilities.invokeLater(…)
在事件调度线程上执行JOptionPane
代码。但是你在这里发布的代码已被破坏。你可以编辑你的帖子并在没有阶段的情况下发布代码吗?很抱歉,我是新的。请确保:查看更新。现在confirmHandler
上的onAlert
根本不使用Stage
。