2017-09-21 41 views
0

我正在使用脚本API为我玩的游戏的机器人制作脚本,但是每当我重写一个bot管理器时,出现一个阻止执行直到关闭它的JOptionPane,但是我想运行这个脚本没有人为干预,所以我想绕过这个窗格。旁路强制JOptionPane

我试图覆盖JOptionPane类在运行时无济于事,我试图联系bot的API的开发人员添加覆盖,但他不想添加覆盖。我正在考虑解决这个问题的任何方法(反射等),我正在考虑检测窗格的标题并强制关闭它,但这超出了我的技能水平。

窗格标题:Override Warning!
我会添加窗格文本,但它会显示个人信息。

+0

你可以创建自己的'JFrame',你完全可以控制它。 –

+0

@JaroslawPawlak可悲的是,它不能工作,因为它被强制作为机器人主框架的一个孩子,我不能控制有限的绘画方法。 –

+0

主框架的孩子? 'JFrame'没有层次结构。无法控制绘画方法?当然,如果你了解'EventDispatchThread'是如何工作的话,那么你可以......但是说实话,你不应该在'paint'方法中做这样的逻辑 - 应该只做绘画。 –

回答

1

这里是禁止所有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()); 
    } 
}