Java 旁路强制接合窗格

Java 旁路强制接合窗格,java,swing,joptionpane,Java,Swing,Joptionpane,我正在使用脚本API为我玩的游戏的机器人制作脚本,但是,每当我覆盖机器人管理器时,会出现一个JOptionPane,它会阻止执行,直到我关闭它,但是我希望在没有人为干预的情况下运行此脚本,因此我希望绕过此窗格 我曾尝试在运行时覆盖JOptionPane类,但没有任何效果,我曾尝试联系bot API的开发人员以添加覆盖,但他不想添加覆盖 我对解决这个问题的任何方法都持开放态度(反射等),我想检测窗格的标题并强制关闭它,但这远远超出了我的技能水平 窗格标题:覆盖警告 我会添加窗格文本,但它会显示个人

我正在使用脚本API为我玩的游戏的机器人制作脚本,但是,每当我覆盖机器人管理器时,会出现一个JOptionPane,它会阻止执行,直到我关闭它,但是我希望在没有人为干预的情况下运行此脚本,因此我希望绕过此窗格

我曾尝试在运行时覆盖JOptionPane类,但没有任何效果,我曾尝试联系bot API的开发人员以添加覆盖,但他不想添加覆盖

我对解决这个问题的任何方法都持开放态度(反射等),我想检测窗格的标题并强制关闭它,但这远远超出了我的技能水平

窗格标题:
覆盖警告

我会添加窗格文本,但它会显示个人信息。

这里有可能抑制所有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());
    }
}

你可以创建你自己的
JFrame
,你可以完全控制它。@JaroslawPawlak很遗憾,这不起作用,因为它被强制作为机器人主框架的子框架,我无法控制它,因为我无法使用有限的绘画方法。主框架的子框架
JFrame
s没有层次结构。无法控制的绘画方法?当然可以,如果您了解了
EventDispatchThread
的工作原理。。。但老实说,你不应该在
paint
方法中执行这样的逻辑-那应该只进行绘制。如果你知道“问题”发生在哪里,你可以运行一个批处理文件,用该JOptionPane的窗口标题终止窗口。它可以读取所有java应用程序的窗口标题,直到找到您不想要的窗口标题,杀死它,然后退出。但是,根据您的操作方式,在关闭之前可能会有一点延迟,导致出现一个可能会分散注意力的短弹出窗口。