Java中使用JGlassPane阻塞JFrame与JDialog

Java中使用JGlassPane阻塞JFrame与JDialog

很多应用中,当用户点击某个操作的时候,我们希望user interface在操作完成前阻塞用户在窗口的其它的操作。简单的调用JFrame.setEnabled(false) 是不够的,原因是:Note: Disabling a lightweight component does not prevent it from receiving MouseEvents(refers to JDK V1.4.2) 。  阻塞用户输入,不仅包括鼠标,而且也包括键盘。下面我把在工作中学习到的一个实现奉献出来,希望大家多多给出意见。
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
/** * A Panel that can be blocked. */
public class BlockingGlassPane extends JPanel {
 
  private int        blockCount = 0;
  private BlockMouse blockMouse = new BlockMouse();
  private BlockKeys  blockKeys  = new BlockKeys();
 
  /** * Constructor. */
  public BlockingGlassPane() {
    setVisible(false);
    setOpaque (false);//设置面板为透明显示
    addMouseListener(blockMouse);//设置鼠标动作监听器,屏蔽鼠标操作
  }
 
  /** * Start or end blocking. * * @param block should blocking be started or ended */
  public void block(boolean block) {
    if (block) {
      if (blockCount == 0) {
        setVisible(true);
 
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));//设置鼠标状态为等待
 
        FocusManager.getCurrentManager().addKeyEventDispatcher(blockKeys);//注册键盘事件派发器,用来拦截键盘事件
      }
      blockCount++;
    } else {
      blockCount--;
      if (blockCount == 0) {
        FocusManager.getCurrentManager().removeKeyEventDispatcher(blockKeys);//移除键盘事件派发器
 
        setCursor(Cursor.getDefaultCursor());//设置鼠标为正常状态
 
        setVisible(false);
      }
    }
  }
 
  /** * Test if this glasspane is blocked. * * @return <code>true</code> if currently blocked */
  public boolean isBlocked() {
    return blockCount > 0;
  }
 
  /** * The key dispatcher to block the keys. */
  private class BlockKeys implements KeyEventDispatcher {
    public boolean dispatchKeyEvent(KeyEvent ev) {
      Component source = ev.getComponent();
      if (source != null &&
          SwingUtilities.isDescendingFrom(source, getParent())) {
        Toolkit.getDefaultToolkit().beep();
        ev.consume();
        return true;
      }
      return false;
    }
  }
 
  /** * The mouse listener used to block the mouse. */
  private class BlockMouse extends MouseAdapter {
    public void mouseClicked(MouseEvent ev) {
      Toolkit.getDefaultToolkit().beep();
    }
  }
}
 
以上实现的使用也比较简单,假设你有一个JFrame对象,然后当用户点击某个按钮时,你希望在操作执行前阻塞用户在JFrame界面上的动作,你需要做以下事情:
在JFrame对象的构造函数中生成一个BlockingGlassPane对象,在此我叫它 bgp;
其次调用JFrame.setGlassPane(bgp)函数使bgp成为JFrame窗口的glass pane(翻译为玻璃窗,可能不对),具体内部我猜想这个玻璃窗应该是JFrame的子窗口,通过其透明的特性,用户只是看不见罢了,其实上面还是有一个窗口的。
在执行操作的代码前加上:bgp.block(true);
执行操作的代码结束时调用:bgp.block(false); 

你可能感兴趣的:(java,jdk,null,Class,import,interface)