2017-09-21 44 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()); 
    } 
}