<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FSwing_JFC%2FGlassPane</id>
		<title>Java/Swing JFC/GlassPane - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FSwing_JFC%2FGlassPane"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Swing_JFC/GlassPane&amp;action=history"/>
		<updated>2026-04-07T06:11:36Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Swing_JFC/GlassPane&amp;diff=7413&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Swing_JFC/GlassPane&amp;diff=7413&amp;oldid=prev"/>
				<updated>2010-06-01T06:44:35Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:44, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Swing_JFC/GlassPane&amp;diff=7412&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Swing_JFC/GlassPane&amp;diff=7412&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:44Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Block mouse and key events in an application ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JProgressBar;&lt;br /&gt;
public class Main extends JFrame {&lt;br /&gt;
  JPanel glass = new JPanel(new GridLayout(0, 1));&lt;br /&gt;
  JLabel padding = new JLabel();&lt;br /&gt;
  JProgressBar waiter = new JProgressBar(0, 100);&lt;br /&gt;
&lt;br /&gt;
  public Main() {&lt;br /&gt;
    setSize(300, 300);&lt;br /&gt;
    setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
    JPanel controlPane = new JPanel(new GridLayout(2, 1));&lt;br /&gt;
    controlPane.setOpaque(false);&lt;br /&gt;
    controlPane.add(new JLabel(&amp;quot;Please wait...&amp;quot;));&lt;br /&gt;
    controlPane.add(waiter);&lt;br /&gt;
    glass.setOpaque(false);&lt;br /&gt;
    glass.add(padding);&lt;br /&gt;
    glass.add(new JLabel());&lt;br /&gt;
    glass.add(controlPane);&lt;br /&gt;
    glass.add(new JLabel());&lt;br /&gt;
    glass.add(new JLabel());&lt;br /&gt;
    glass.setSize(new Dimension(300,300));&lt;br /&gt;
    setGlassPane(glass);&lt;br /&gt;
&lt;br /&gt;
    JButton startB = new JButton(&amp;quot;Start!&amp;quot;);&lt;br /&gt;
    startB.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent A) {&lt;br /&gt;
        glass.setVisible(true);&lt;br /&gt;
        padding.requestFocus();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    Container contentPane = getContentPane();&lt;br /&gt;
    contentPane.add(startB, BorderLayout.SOUTH);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    Main ge = new Main();&lt;br /&gt;
    ge.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Demonstrate use of GlassPane ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import java.awt.GridBagLayout;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
/*&lt;br /&gt;
 * Demonstrate use of GlassPane in JWindow &amp;amp; friends. Buttons enable/disable it.&lt;br /&gt;
 * @author Eckstein et al, in the O&amp;quot;Reilly book &amp;quot;Java Swing&amp;quot;&lt;br /&gt;
 */&lt;br /&gt;
public class GlassExample {&lt;br /&gt;
  /** Construct a Splash screen with the given image */&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    JFrame f = new JFrame(&amp;quot;GlassPane&amp;quot;);&lt;br /&gt;
    final JPanel p1 = new JPanel();&lt;br /&gt;
    p1.add(new JLabel(&amp;quot;GlassPane Example&amp;quot;));&lt;br /&gt;
    JButton show = new JButton(&amp;quot;Show&amp;quot;);&lt;br /&gt;
    p1.add(show);&lt;br /&gt;
    p1.add(new JButton(&amp;quot;No-op&amp;quot;));&lt;br /&gt;
    f.getContentPane().add(p1);&lt;br /&gt;
    final JPanel glass = (JPanel) f.getGlassPane();&lt;br /&gt;
    glass.setVisible(true);&lt;br /&gt;
    glass.setLayout(new GridBagLayout());&lt;br /&gt;
    JButton glassButton = new JButton(&amp;quot;Hide&amp;quot;);&lt;br /&gt;
    glass.add(glassButton);&lt;br /&gt;
    f.setSize(150, 80);&lt;br /&gt;
    f.setVisible(true);&lt;br /&gt;
    boolean debug = false;&lt;br /&gt;
    if (debug) {&lt;br /&gt;
      System.out.println(&amp;quot;Button is &amp;quot; + glassButton);&lt;br /&gt;
      System.out.println(&amp;quot;GlassPane is &amp;quot; + glass);&lt;br /&gt;
    }&lt;br /&gt;
    // Add actions to the buttons...&lt;br /&gt;
    // show button (re-)shows the glass pane.&lt;br /&gt;
    show.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent e) {&lt;br /&gt;
        glass.setVisible(true);&lt;br /&gt;
        p1.repaint();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    // hide button hides the Glass Pane to show what&amp;quot;s under.&lt;br /&gt;
    glassButton.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent e) {&lt;br /&gt;
        glass.setVisible(false);&lt;br /&gt;
        p1.repaint();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Paint on glass pane ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.ruponent;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Point;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.MouseAdapter;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.awt.event.MouseMotionAdapter;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
public class Main extends JComponent {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    JFrame frame = new JFrame();&lt;br /&gt;
    final JButton activate = new JButton(&amp;quot;Show&amp;quot;);&lt;br /&gt;
    frame.add(activate);&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
    final Main glass = new Main(frame);&lt;br /&gt;
    frame.setGlassPane(glass);&lt;br /&gt;
    activate.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(ActionEvent evt) {&lt;br /&gt;
        glass.setVisible(true);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  JFrame frame;&lt;br /&gt;
  Point cursor;&lt;br /&gt;
  public Main(JFrame frame) {&lt;br /&gt;
    this.frame = frame;&lt;br /&gt;
    cursor = new Point();&lt;br /&gt;
    this.addMouseMotionListener(new MouseMotionAdapter() {&lt;br /&gt;
      public void mouseMoved(MouseEvent evt) {&lt;br /&gt;
        cursor = new Point(evt.getPoint());&lt;br /&gt;
        Main.this.repaint();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    this.addMouseListener(new MouseAdapter() {&lt;br /&gt;
      public void mouseClicked(MouseEvent evt) {&lt;br /&gt;
        Main.this.setVisible(false);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    Container root = frame.getContentPane();&lt;br /&gt;
    myPaint(root, g);&lt;br /&gt;
  }&lt;br /&gt;
  private void myPaint(Component comp, Graphics g) {&lt;br /&gt;
    int x = comp.getX();&lt;br /&gt;
    int y = comp.getY();&lt;br /&gt;
    g.translate(x, y);&lt;br /&gt;
    cursor.translate(-x, -y);&lt;br /&gt;
    if (comp.contains(cursor)) {&lt;br /&gt;
      String cls_name = comp.getClass().getName();&lt;br /&gt;
      g.setColor(Color.black);&lt;br /&gt;
      g.drawString(cls_name, 0, 10);&lt;br /&gt;
    }&lt;br /&gt;
    if (comp instanceof Container) {&lt;br /&gt;
      Container cont = (Container) comp;&lt;br /&gt;
      for (int i = 0; i &amp;lt; cont.getComponentCount(); i++) {&lt;br /&gt;
        Component child = cont.getComponent(i);&lt;br /&gt;
        myPaint(child, g);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    cursor.translate(x, y);&lt;br /&gt;
    g.translate(-x, -y);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Replace existing GlassPane ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions of source code must retain the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *     notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *     documentation and/or other materials provided with the distribution.&lt;br /&gt;
 *&lt;br /&gt;
 *   - Neither the name of Sun Microsystems nor the names of its&lt;br /&gt;
 *     contributors may be used to endorse or promote products derived&lt;br /&gt;
 *     from this software without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &amp;quot;AS&lt;br /&gt;
 * IS&amp;quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR&lt;br /&gt;
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,&lt;br /&gt;
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,&lt;br /&gt;
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR&lt;br /&gt;
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF&lt;br /&gt;
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING&lt;br /&gt;
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS&lt;br /&gt;
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.ruponent;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.FlowLayout;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Point;&lt;br /&gt;
import java.awt.Toolkit;&lt;br /&gt;
import java.awt.event.ItemEvent;&lt;br /&gt;
import java.awt.event.ItemListener;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import javax.swing.AbstractButton;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JCheckBox;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JMenu;&lt;br /&gt;
import javax.swing.JMenuBar;&lt;br /&gt;
import javax.swing.JMenuItem;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import javax.swing.event.MouseInputAdapter;&lt;br /&gt;
/** An application that requires no other files. */&lt;br /&gt;
public class GlassPaneDemo {&lt;br /&gt;
  static private MyGlassPane myGlassPane;&lt;br /&gt;
  /**&lt;br /&gt;
   * Create the GUI and show it. For thread safety, this method should be&lt;br /&gt;
   * invoked from the event-dispatching thread.&lt;br /&gt;
   */&lt;br /&gt;
  private static void createAndShowGUI() {&lt;br /&gt;
    // Create and set up the window.&lt;br /&gt;
    JFrame frame = new JFrame(&amp;quot;GlassPaneDemo&amp;quot;);&lt;br /&gt;
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
    // Start creating and adding components.&lt;br /&gt;
    JCheckBox changeButton = new JCheckBox(&amp;quot;Glass pane \&amp;quot;visible\&amp;quot;&amp;quot;);&lt;br /&gt;
    changeButton.setSelected(false);&lt;br /&gt;
    // Set up the content pane, where the &amp;quot;main GUI&amp;quot; lives.&lt;br /&gt;
    Container contentPane = frame.getContentPane();&lt;br /&gt;
    contentPane.setLayout(new FlowLayout());&lt;br /&gt;
    contentPane.add(changeButton);&lt;br /&gt;
    contentPane.add(new JButton(&amp;quot;Button 1&amp;quot;));&lt;br /&gt;
    contentPane.add(new JButton(&amp;quot;Button 2&amp;quot;));&lt;br /&gt;
    // Set up the menu bar, which appears above the content pane.&lt;br /&gt;
    JMenuBar menuBar = new JMenuBar();&lt;br /&gt;
    JMenu menu = new JMenu(&amp;quot;Menu&amp;quot;);&lt;br /&gt;
    menu.add(new JMenuItem(&amp;quot;Do nothing&amp;quot;));&lt;br /&gt;
    menuBar.add(menu);&lt;br /&gt;
    frame.setJMenuBar(menuBar);&lt;br /&gt;
    // Set up the glass pane, which appears over both menu bar&lt;br /&gt;
    // and content pane and is an item listener on the change&lt;br /&gt;
    // button.&lt;br /&gt;
    myGlassPane = new MyGlassPane(changeButton, menuBar, frame.getContentPane());&lt;br /&gt;
    changeButton.addItemListener(myGlassPane);&lt;br /&gt;
    frame.setGlassPane(myGlassPane);&lt;br /&gt;
    // Show the window.&lt;br /&gt;
    frame.pack();&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    // Schedule a job for the event-dispatching thread:&lt;br /&gt;
    // creating and showing this application&amp;quot;s GUI.&lt;br /&gt;
    javax.swing.SwingUtilities.invokeLater(new Runnable() {&lt;br /&gt;
      public void run() {&lt;br /&gt;
        createAndShowGUI();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * We have to provide our own glass pane so that it can paint.&lt;br /&gt;
 */&lt;br /&gt;
class MyGlassPane extends JComponent implements ItemListener {&lt;br /&gt;
  Point point;&lt;br /&gt;
  // React to change button clicks.&lt;br /&gt;
  public void itemStateChanged(ItemEvent e) {&lt;br /&gt;
    setVisible(e.getStateChange() == ItemEvent.SELECTED);&lt;br /&gt;
  }&lt;br /&gt;
  protected void paintComponent(Graphics g) {&lt;br /&gt;
    if (point != null) {&lt;br /&gt;
      g.setColor(Color.red);&lt;br /&gt;
      g.fillOval(point.x - 10, point.y - 10, 20, 20);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public void setPoint(Point p) {&lt;br /&gt;
    point = p;&lt;br /&gt;
  }&lt;br /&gt;
  public MyGlassPane(AbstractButton aButton, JMenuBar menuBar,&lt;br /&gt;
      Container contentPane) {&lt;br /&gt;
    CBListener listener = new CBListener(aButton, menuBar, this, contentPane);&lt;br /&gt;
    addMouseListener(listener);&lt;br /&gt;
    addMouseMotionListener(listener);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
/**&lt;br /&gt;
 * Listen for all events that our check box is likely to be interested in.&lt;br /&gt;
 * Redispatch them to the check box.&lt;br /&gt;
 */&lt;br /&gt;
class CBListener extends MouseInputAdapter {&lt;br /&gt;
  Toolkit toolkit;&lt;br /&gt;
  Component liveButton;&lt;br /&gt;
  JMenuBar menuBar;&lt;br /&gt;
  MyGlassPane glassPane;&lt;br /&gt;
  Container contentPane;&lt;br /&gt;
  public CBListener(Component liveButton, JMenuBar menuBar,&lt;br /&gt;
      MyGlassPane glassPane, Container contentPane) {&lt;br /&gt;
    toolkit = Toolkit.getDefaultToolkit();&lt;br /&gt;
    this.liveButton = liveButton;&lt;br /&gt;
    this.menuBar = menuBar;&lt;br /&gt;
    this.glassPane = glassPane;&lt;br /&gt;
    this.contentPane = contentPane;&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseMoved(MouseEvent e) {&lt;br /&gt;
    redispatchMouseEvent(e, false);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseDragged(MouseEvent e) {&lt;br /&gt;
    redispatchMouseEvent(e, false);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseClicked(MouseEvent e) {&lt;br /&gt;
    redispatchMouseEvent(e, false);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseEntered(MouseEvent e) {&lt;br /&gt;
    redispatchMouseEvent(e, false);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseExited(MouseEvent e) {&lt;br /&gt;
    redispatchMouseEvent(e, false);&lt;br /&gt;
  }&lt;br /&gt;
  public void mousePressed(MouseEvent e) {&lt;br /&gt;
    redispatchMouseEvent(e, false);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseReleased(MouseEvent e) {&lt;br /&gt;
    redispatchMouseEvent(e, true);&lt;br /&gt;
  }&lt;br /&gt;
  // A basic implementation of redispatching events.&lt;br /&gt;
  private void redispatchMouseEvent(MouseEvent e, boolean repaint) {&lt;br /&gt;
    Point glassPanePoint = e.getPoint();&lt;br /&gt;
    Container container = contentPane;&lt;br /&gt;
    Point containerPoint = SwingUtilities.convertPoint(glassPane,&lt;br /&gt;
        glassPanePoint, contentPane);&lt;br /&gt;
    if (containerPoint.y &amp;lt; 0) { // we&amp;quot;re not in the content pane&lt;br /&gt;
      if (containerPoint.y + menuBar.getHeight() &amp;gt;= 0) {&lt;br /&gt;
        // The mouse event is over the menu bar.&lt;br /&gt;
        // Could handle specially.&lt;br /&gt;
      } else {&lt;br /&gt;
        // The mouse event is over non-system window&lt;br /&gt;
        // decorations, such as the ones provided by&lt;br /&gt;
        // the Java look and feel.&lt;br /&gt;
        // Could handle specially.&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      // The mouse event is probably over the content pane.&lt;br /&gt;
      // Find out exactly which component it&amp;quot;s over.&lt;br /&gt;
      Component component = SwingUtilities.getDeepestComponentAt(container,&lt;br /&gt;
          containerPoint.x, containerPoint.y);&lt;br /&gt;
      if ((component != null) &amp;amp;&amp;amp; (component.equals(liveButton))) {&lt;br /&gt;
        // Forward events over the check box.&lt;br /&gt;
        Point componentPoint = SwingUtilities.convertPoint(glassPane,&lt;br /&gt;
            glassPanePoint, component);&lt;br /&gt;
        component.dispatchEvent(new MouseEvent(component, e.getID(), e&lt;br /&gt;
            .getWhen(), e.getModifiers(), componentPoint.x, componentPoint.y, e&lt;br /&gt;
            .getClickCount(), e.isPopupTrigger()));&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    // Update the glass pane if requested.&lt;br /&gt;
    if (repaint) {&lt;br /&gt;
      glassPane.setPoint(glassPanePoint);&lt;br /&gt;
      glassPane.repaint();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show how a glass pane can be used to block mouse (and key!) events ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
/*&lt;br /&gt;
Java Swing, 2nd Edition&lt;br /&gt;
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole&lt;br /&gt;
ISBN: 0-596-00408-7&lt;br /&gt;
Publisher: O&amp;quot;Reilly &lt;br /&gt;
*/&lt;br /&gt;
/*&lt;br /&gt;
This directory contains a fixed GlassPane example.  &lt;br /&gt;
This fixes two bugs:&lt;br /&gt;
  1) Key events were not supressed in the original example, they are now&lt;br /&gt;
  2) On 1.2 and 1.3 systems, firHtmlLabelst mouse click after removing glass pane&lt;br /&gt;
     would not be sent to the component under the mouse.  This was a bug&lt;br /&gt;
     in the way JRootPane handled the glass pane component that has been&lt;br /&gt;
     fixed in the 1.4 release.  FixedGlassPane.java (see below) provides&lt;br /&gt;
     a workaround for 1.2 and 1.3, but is still safe to use with 1.4.&lt;br /&gt;
The updated files are:&lt;br /&gt;
SwingGlassExample.java       Updated to use (and control) the new glass pane&lt;br /&gt;
FixedGlassPane.java    Extension of JPanel that allows for redispatching&lt;br /&gt;
                                      erroneous events to their rightful owners&lt;br /&gt;
*/&lt;br /&gt;
// SwingGlassExample.java&lt;br /&gt;
//Show how a glass pane can be used to block mouse (and key!) events.&lt;br /&gt;
//Updated in response to discussions with Mark Hansen at Unify.&lt;br /&gt;
//&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.ruponent;&lt;br /&gt;
import java.awt.Container;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.Point;&lt;br /&gt;
import java.awt.Toolkit;&lt;br /&gt;
import java.awt.event.ActionEvent;&lt;br /&gt;
import java.awt.event.ActionListener;&lt;br /&gt;
import java.awt.event.FocusEvent;&lt;br /&gt;
import java.awt.event.FocusListener;&lt;br /&gt;
import java.awt.event.MouseEvent;&lt;br /&gt;
import java.awt.event.MouseListener;&lt;br /&gt;
import java.awt.event.MouseMotionListener;&lt;br /&gt;
import javax.swing.ImageIcon;&lt;br /&gt;
import javax.swing.JButton;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JMenuBar;&lt;br /&gt;
import javax.swing.JOptionPane;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
import javax.swing.JProgressBar;&lt;br /&gt;
import javax.swing.SwingUtilities;&lt;br /&gt;
import javax.swing.Timer;&lt;br /&gt;
public class SwingGlassExample extends JFrame {&lt;br /&gt;
  // We&amp;quot;ll use a custom glass pane rather than a generic JPanel.&lt;br /&gt;
  FixedGlassPane glass;&lt;br /&gt;
  JProgressBar waiter = new JProgressBar(0, 100);&lt;br /&gt;
  Timer timer;&lt;br /&gt;
  public SwingGlassExample() {&lt;br /&gt;
    super(&amp;quot;GlassPane Demo&amp;quot;);&lt;br /&gt;
    setSize(500, 300);&lt;br /&gt;
    setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br /&gt;
    // Now set up a few buttons &amp;amp; images for the main application&lt;br /&gt;
    JPanel mainPane = new JPanel();&lt;br /&gt;
    mainPane.setBackground(Color.white);&lt;br /&gt;
    JButton redB = new JButton(&amp;quot;Red&amp;quot;);&lt;br /&gt;
    JButton blueB = new JButton(&amp;quot;Blue&amp;quot;);&lt;br /&gt;
    JButton greenB = new JButton(&amp;quot;Green&amp;quot;);&lt;br /&gt;
    mainPane.add(redB);&lt;br /&gt;
    mainPane.add(greenB);&lt;br /&gt;
    mainPane.add(blueB);&lt;br /&gt;
    mainPane.add(new JLabel(new ImageIcon(&amp;quot;oreilly.gif&amp;quot;)));&lt;br /&gt;
    // Attach the popup debugger to the main app buttons so you&lt;br /&gt;
    // see the effect of making a glass pane visible&lt;br /&gt;
    PopupDebugger pd = new PopupDebugger(this);&lt;br /&gt;
    redB.addActionListener(pd);&lt;br /&gt;
    greenB.addActionListener(pd);&lt;br /&gt;
    blueB.addActionListener(pd);&lt;br /&gt;
    // And last but not least, our button to launch the glass pane&lt;br /&gt;
    JButton startB = new JButton(&amp;quot;Start the big operation!&amp;quot;);&lt;br /&gt;
    startB.addActionListener(new ActionListener() {&lt;br /&gt;
      public void actionPerformed(java.awt.event.ActionEvent A) {&lt;br /&gt;
        // manually control the 1.2/1.3 bug work-around&lt;br /&gt;
        glass.setNeedToRedispatch(false);&lt;br /&gt;
        glass.setVisible(true);&lt;br /&gt;
        startTimer();&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    Container contentPane = getContentPane();&lt;br /&gt;
    contentPane.add(mainPane, BorderLayout.CENTER);&lt;br /&gt;
    contentPane.add(startB, BorderLayout.SOUTH);&lt;br /&gt;
    // Set up the glass pane with a little message and a progress bar...&lt;br /&gt;
    JPanel controlPane = new JPanel(new GridLayout(2, 1));&lt;br /&gt;
    controlPane.setOpaque(false);&lt;br /&gt;
    controlPane.add(new JLabel(&amp;quot;Please wait...&amp;quot;));&lt;br /&gt;
    controlPane.add(waiter);&lt;br /&gt;
    glass = new FixedGlassPane(getJMenuBar(), getContentPane());&lt;br /&gt;
    glass.setLayout(new GridLayout(0, 1));&lt;br /&gt;
    glass.setOpaque(false);&lt;br /&gt;
    glass.add(new JLabel()); // padding...&lt;br /&gt;
    glass.add(new JLabel());&lt;br /&gt;
    glass.add(controlPane);&lt;br /&gt;
    glass.add(new JLabel());&lt;br /&gt;
    glass.add(new JLabel());&lt;br /&gt;
    setGlassPane(glass);&lt;br /&gt;
  }&lt;br /&gt;
  // A quick method to start up a 10 second timer and update the&lt;br /&gt;
  // progress bar&lt;br /&gt;
  public void startTimer() {&lt;br /&gt;
    if (timer == null) {&lt;br /&gt;
      timer = new Timer(1000, new ActionListener() {&lt;br /&gt;
        int progress = 0;&lt;br /&gt;
        public void actionPerformed(ActionEvent A) {&lt;br /&gt;
          progress += 10;&lt;br /&gt;
          waiter.setValue(progress);&lt;br /&gt;
          // Once we hit 100%, remove the glass pane and reset the&lt;br /&gt;
          // progress bar stuff&lt;br /&gt;
          if (progress &amp;gt;= 100) {&lt;br /&gt;
            progress = 0;&lt;br /&gt;
            timer.stop();&lt;br /&gt;
            glass.setVisible(false);&lt;br /&gt;
            // Again, manually control our 1.2/1.3 bug workaround&lt;br /&gt;
            glass.setNeedToRedispatch(true);&lt;br /&gt;
            waiter.setValue(0);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      });&lt;br /&gt;
    }&lt;br /&gt;
    if (timer.isRunning()) {&lt;br /&gt;
      timer.stop();&lt;br /&gt;
    }&lt;br /&gt;
    timer.start();&lt;br /&gt;
  }&lt;br /&gt;
  // A graphical debugger that pops up anytime a button is pressed&lt;br /&gt;
  public class PopupDebugger implements ActionListener {&lt;br /&gt;
    private JFrame parent;&lt;br /&gt;
    public PopupDebugger(JFrame f) {&lt;br /&gt;
      parent = f;&lt;br /&gt;
    }&lt;br /&gt;
    public void actionPerformed(ActionEvent ae) {&lt;br /&gt;
      JOptionPane.showMessageDialog(parent, ae.getActionCommand());&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    SwingGlassExample ge = new SwingGlassExample();&lt;br /&gt;
    ge.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
// Based in part on code from the Java Tutorial for glass panes (java.sun.ru).&lt;br /&gt;
// This version handles both mouse events and focus events.  The focus is&lt;br /&gt;
// held on the panel so that key events are also effectively ignored.  (But&lt;br /&gt;
// a KeyListener could still be attached by the program activating this pane.)&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
class FixedGlassPane extends JPanel implements MouseListener,&lt;br /&gt;
    MouseMotionListener, FocusListener {&lt;br /&gt;
  // helpers for redispatch logic&lt;br /&gt;
  Toolkit toolkit;&lt;br /&gt;
  JMenuBar menuBar;&lt;br /&gt;
  Container contentPane;&lt;br /&gt;
  boolean inDrag = false;&lt;br /&gt;
  // trigger for redispatching (allows external control)&lt;br /&gt;
  boolean needToRedispatch = false;&lt;br /&gt;
  public FixedGlassPane(JMenuBar mb, Container cp) {&lt;br /&gt;
    toolkit = Toolkit.getDefaultToolkit();&lt;br /&gt;
    menuBar = mb;&lt;br /&gt;
    contentPane = cp;&lt;br /&gt;
    addMouseListener(this);&lt;br /&gt;
    addMouseMotionListener(this);&lt;br /&gt;
    addFocusListener(this);&lt;br /&gt;
  }&lt;br /&gt;
  public void setVisible(boolean v) {&lt;br /&gt;
    // Make sure we grab the focus so that key events don&amp;quot;t go astray.&lt;br /&gt;
    if (v)&lt;br /&gt;
      requestFocus();&lt;br /&gt;
    super.setVisible(v);&lt;br /&gt;
  }&lt;br /&gt;
  // Once we have focus, keep it if we&amp;quot;re visible&lt;br /&gt;
  public void focusLost(FocusEvent fe) {&lt;br /&gt;
    if (isVisible())&lt;br /&gt;
      requestFocus();&lt;br /&gt;
  }&lt;br /&gt;
  public void focusGained(FocusEvent fe) {&lt;br /&gt;
  }&lt;br /&gt;
  // We only need to redispatch if we&amp;quot;re not visible, but having full control&lt;br /&gt;
  // over this might prove handy.&lt;br /&gt;
  public void setNeedToRedispatch(boolean need) {&lt;br /&gt;
    needToRedispatch = need;&lt;br /&gt;
  }&lt;br /&gt;
  /*&lt;br /&gt;
   * (Based on code from the Java Tutorial) We must forward at least the mouse&lt;br /&gt;
   * drags that started with mouse presses over the check box. Otherwise, when&lt;br /&gt;
   * the user presses the check box then drags off, the check box isn&amp;quot;t&lt;br /&gt;
   * disarmed -- it keeps its dark gray background or whatever its L&amp;amp;F uses to&lt;br /&gt;
   * indicate that the button is currently being pressed.&lt;br /&gt;
   */&lt;br /&gt;
  public void mouseDragged(MouseEvent e) {&lt;br /&gt;
    if (needToRedispatch)&lt;br /&gt;
      redispatchMouseEvent(e);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseMoved(MouseEvent e) {&lt;br /&gt;
    if (needToRedispatch)&lt;br /&gt;
      redispatchMouseEvent(e);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseClicked(MouseEvent e) {&lt;br /&gt;
    if (needToRedispatch)&lt;br /&gt;
      redispatchMouseEvent(e);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseEntered(MouseEvent e) {&lt;br /&gt;
    if (needToRedispatch)&lt;br /&gt;
      redispatchMouseEvent(e);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseExited(MouseEvent e) {&lt;br /&gt;
    if (needToRedispatch)&lt;br /&gt;
      redispatchMouseEvent(e);&lt;br /&gt;
  }&lt;br /&gt;
  public void mousePressed(MouseEvent e) {&lt;br /&gt;
    if (needToRedispatch)&lt;br /&gt;
      redispatchMouseEvent(e);&lt;br /&gt;
  }&lt;br /&gt;
  public void mouseReleased(MouseEvent e) {&lt;br /&gt;
    if (needToRedispatch) {&lt;br /&gt;
      redispatchMouseEvent(e);&lt;br /&gt;
      inDrag = false;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private void redispatchMouseEvent(MouseEvent e) {&lt;br /&gt;
    boolean inButton = false;&lt;br /&gt;
    boolean inMenuBar = false;&lt;br /&gt;
    Point glassPanePoint = e.getPoint();&lt;br /&gt;
    Component component = null;&lt;br /&gt;
    Container container = contentPane;&lt;br /&gt;
    Point containerPoint = SwingUtilities.convertPoint(this,&lt;br /&gt;
        glassPanePoint, contentPane);&lt;br /&gt;
    int eventID = e.getID();&lt;br /&gt;
    if (containerPoint.y &amp;lt; 0) {&lt;br /&gt;
      inMenuBar = true;&lt;br /&gt;
      container = menuBar;&lt;br /&gt;
      containerPoint = SwingUtilities.convertPoint(this, glassPanePoint,&lt;br /&gt;
          menuBar);&lt;br /&gt;
      testForDrag(eventID);&lt;br /&gt;
    }&lt;br /&gt;
    //XXX: If the event is from a component in a popped-up menu,&lt;br /&gt;
    //XXX: then the container should probably be the menu&amp;quot;s&lt;br /&gt;
    //XXX: JPopupMenu, and containerPoint should be adjusted&lt;br /&gt;
    //XXX: accordingly.&lt;br /&gt;
    component = SwingUtilities.getDeepestComponentAt(container,&lt;br /&gt;
        containerPoint.x, containerPoint.y);&lt;br /&gt;
    if (component == null) {&lt;br /&gt;
      return;&lt;br /&gt;
    } else {&lt;br /&gt;
      inButton = true;&lt;br /&gt;
      testForDrag(eventID);&lt;br /&gt;
    }&lt;br /&gt;
    if (inMenuBar || inButton || inDrag) {&lt;br /&gt;
      Point componentPoint = SwingUtilities.convertPoint(this,&lt;br /&gt;
          glassPanePoint, component);&lt;br /&gt;
      component.dispatchEvent(new MouseEvent(component, eventID, e&lt;br /&gt;
          .getWhen(), e.getModifiers(), componentPoint.x,&lt;br /&gt;
          componentPoint.y, e.getClickCount(), e.isPopupTrigger()));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  private void testForDrag(int eventID) {&lt;br /&gt;
    if (eventID == MouseEvent.MOUSE_PRESSED) {&lt;br /&gt;
      inDrag = true;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>