java - 绕过强制 JOptionPane

标签 java swing joptionpane

我正在使用脚本 API 为我玩的游戏的机器人制作脚本,但是每当我覆盖机器人管理器时,就会出现一个 JOptionPane 来阻止执行,直到我关闭它,但是我想在不运行该脚本的情况下运行此脚本人为干预,所以我想绕过这个 Pane 。

我尝试在运行时覆盖 JOptionPane 类,但没有成功,并且我尝试联系机器人 API 的开发人员来添加覆盖,但他不想添加覆盖。

我愿意接受任何解决此问题的方法(反射等),我正在考虑检测 Pane 的标题并强制关闭它,但这超出了我的技能水平。

Pane 标题:覆盖警告!
我会添加 Pane 文本,但它会显示个人信息。

最佳答案

这里可以抑制所有 JOptionPane 对话框。如果您想对其中一些进行此操作,您可能需要对对话框标题进行额外检查。

import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class CloseDialog implements Runnable {

    private final AWTEventListener hideOptionPaneListener = new AWTEventListener() {

        @Override
        public void eventDispatched(AWTEvent event) {
            if (event instanceof WindowEvent) {
                processWindowEvent((WindowEvent) event);
            }
        }
    };

    private void processWindowEvent(WindowEvent we) {
        if (we.getID() == WindowEvent.WINDOW_OPENED && we.getWindow() instanceof JDialog) {
            final JDialog dlg = (JDialog) we.getWindow();
            Component[] comps = dlg.getContentPane().getComponents();
            if (comps.length > 0 && comps[0] instanceof JOptionPane) { // probably also check dialog title
                dlg.setVisible(false);
            }
        }
    }

    @Override
    public void run() {
        final JFrame frm = new JFrame("Test frame");
        JButton button = new JButton("Show option pane");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frm, "Simple message");
            }
        });
        final JCheckBox checkBox = new JCheckBox("Suppress option pane");
        checkBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (checkBox.isSelected()) {
                    Toolkit.getDefaultToolkit().addAWTEventListener(hideOptionPaneListener, AWTEvent.WINDOW_EVENT_MASK);
                } else {
                    Toolkit.getDefaultToolkit().removeAWTEventListener(hideOptionPaneListener);
                }
            }
        });
        JPanel top = new JPanel(new FlowLayout());
        top.add(button);
        frm.add(top, BorderLayout.NORTH);
        frm.add(checkBox, BorderLayout.SOUTH);
        frm.setSize(400, 200);
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new CloseDialog());
    }
}

关于java - 绕过强制 JOptionPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46341316/

相关文章:

java - 在 WindowBuilder Pro 中滚动 JScrollBar

java - Swing :在一组对象中进行选择

java - 排列/组合计算器上的 GUI 问题

java - 如何防止文本在 JavaFX 中的小按钮上变成省略号?

java - 在java JPanel中对齐文本

java - SQSListener 不消耗队列中的消息

java - JFilechooser 的文件名文本字段

java - 如何用始终在最上面的对话框结束 Swing 程序?

java - 如何在 Selenium Web 驱动程序中与不同用户并行登录网站?

java - 使用 Java 的 Mac Os 中的系统托盘(菜单附加功能)图标