如何读取JOptionPane.showMessageDialog内容及获取鼠标点击位置
问题解答
问题1:如何读取JOptionPane.showMessageDialog的内容?
首先得明确:JOptionPane.showMessageDialog()本身是仅用于展示消息的弹窗,它的设计逻辑里,你调用它时传入的消息内容,其实你自己已经持有啦!比如你写:
String showContent = "这是弹窗要显示的文本"; JOptionPane.showMessageDialog(null, showContent);
直接用变量showContent就能拿到这个内容。
如果你的场景是想捕获非自己代码弹出的showMessageDialog内容,或者需要动态获取弹窗内的文本,默认的JOptionPane内部组件是封装起来的,没法直接读取。这时候可以自定义一个对话框,把展示的内容存下来:
public class CustomMessageDialog extends JOptionPane { private String displayedMsg; public CustomMessageDialog(String message) { displayedMsg = message; showMessageDialog(null, message); } public String getDisplayedMessage() { return displayedMsg; } } // 使用示例 CustomMessageDialog dialog = new CustomMessageDialog("自定义弹窗的内容"); String content = dialog.getDisplayedMessage();
问题2:获取JxBrowser中鼠标点击的位置
你的代码没写完,我给你两种实用的实现方式:
方式1:给BrowserView添加Java层面的鼠标监听器
直接给Swing的BrowserView组件加鼠标监听,能拿到相对于组件的点击坐标,还能转成页面内的坐标:
import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.swing.BrowserView; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class Test { public static void main(String[] args) { final Browser browser = new Browser(); BrowserView view = new BrowserView(browser); // 添加鼠标点击监听 view.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // 获取相对于BrowserView组件的坐标 int compX = e.getX(); int compY = e.getY(); System.out.println("组件内点击位置:x=" + compX + ", y=" + compY); // 转换为网页页面内的坐标 com.teamdev.jxbrowser.chromium.Point pagePoint = view.toPagePoint(new Point(compX, compY)); System.out.println("页面内点击位置:x=" + pagePoint.getX() + ", y=" + pagePoint.getY()); } }); // 初始化窗口 JFrame frame = new JFrame("JxBrowser 鼠标点击测试"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.add(view, BorderLayout.CENTER); frame.setSize(800, 600); frame.setLocationRelativeTo(null); frame.setVisible(true); browser.loadURL("https://www.example.com"); } }
方式2:通过JavaScript监听页面点击,传递坐标到Java
如果需要更精准的网页内坐标(比如相对于文档的位置),可以注入JS监听点击事件,再把坐标传给Java代码:
import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.JSFunctionCallback; import com.teamdev.jxbrowser.chromium.JSObject; import com.teamdev.jxbrowser.chromium.swing.BrowserView; import javax.swing.*; import java.awt.*; public class Test { public static void main(String[] args) { final Browser browser = new Browser(); BrowserView view = new BrowserView(browser); // 页面加载完成后注入JS监听 browser.addLoadListener(new com.teamdev.jxbrowser.chromium.LoadListener() { @Override public void onStartLoadingFrame(com.teamdev.jxbrowser.chromium.LoadEvent event) {} @Override public void onFinishLoadingFrame(com.teamdev.jxbrowser.chromium.LoadEvent event) { if (event.isMainFrame()) { // 获取网页的window对象 JSObject window = browser.executeJavaScriptAndReturnValue("window").asObject(); // 注册Java回调函数给JS调用 window.setProperty("reportClickPos", new JSFunctionCallback() { @Override public Object invoke(Object... args) { int pageX = (int) args[0]; int pageY = (int) args[1]; System.out.println("JS传递的页面点击位置:x=" + pageX + ", y=" + pageY); return null; } }); // 注入JS代码,监听页面点击事件 browser.executeJavaScript( "document.addEventListener('click', function(e) {" + " reportClickPos(e.clientX, e.clientY);" + "});" ); } } @Override public void onFailLoadingFrame(com.teamdev.jxbrowser.chromium.LoadEvent event) {} @Override public void onDocumentLoadedInFrame(com.teamdev.jxbrowser.chromium.LoadEvent event) {} }); // 初始化窗口 JFrame frame = new JFrame("JxBrowser JS监听点击"); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.add(view, BorderLayout.CENTER); frame.setSize(800, 600); frame.setLocationRelativeTo(null); frame.setVisible(true); browser.loadURL("https://www.example.com"); } }
内容的提问来源于stack exchange,提问作者DIIMIIM
相关产品推荐
相关产品推荐

