GlassPane Intercepts Event
/* * Copyright (c) 2007, Romain Guy * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the TimingFramework project nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Composite; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.LinearGradientPaint; import java.awt.Paint; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.KeyAdapter; import java.awt.event.MouseAdapter; import java.awt.event.MouseMotionAdapter; import javax.swing.JComponent; /** * * @author Romain Guy */ public class GlassPaneInterceptEvent extends javax.swing.JFrame { private static final int MAX_DELAY = 300; private ProgressGlassPane glassPane; public GlassPaneInterceptEvent() { initComponents(); setGlassPane(glassPane = new ProgressGlassPane()); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { javax.swing.JButton buttonDownload; javax.swing.JLabel jLabel1; javax.swing.JScrollPane jScrollPane1; jLabel1 = new javax.swing.JLabel(); buttonDownload = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); filesTable = new javax.swing.JTable(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("Glass Pane Painting"); setResizable(false); jLabel1.setText("Pick a file for download"); buttonDownload.setText("Start Download"); buttonDownload.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonDownloadActionPerformed(evt); } }); filesTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {"aerith.png", "/www/progx/images/", "PNG", "5/17/2006"}, {"blog.html", "/www/progx", "HTML", "3/1/2006"}, {"index.html", "/www/progx", "HTML", "9/12/2006"}, {"pictures.zip", "/www/progx", "ZIP", "10/8/2006"} }, new String [] { "Name", "Path", "Type", "Date" } )); jScrollPane1.setViewportView(filesTable); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(layout.createSequentialGroup() .addContainerGap() .add(buttonDownload)) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel1)) .add(layout.createSequentialGroup() .addContainerGap() .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 513, Short.MAX_VALUE)))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(20, 20, 20) .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 275, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(buttonDownload) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-553)/2, (screenSize.height-394)/2, 553, 394); }// </editor-fold>//GEN-END:initComponents private void buttonDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonDownloadActionPerformed getGlassPane().setVisible(true); startDownloadThread(); }//GEN-LAST:event_buttonDownloadActionPerformed private void startDownloadThread() { Thread downloader = new Thread(new Runnable() { public void run() { int i = 0; do { try { Thread.sleep(30 + (int) (Math.random() * MAX_DELAY)); } catch (InterruptedException ex) { // who cares here? } i += (int) (Math.random() * 5); glassPane.setProgress(i); } while (i < 100); glassPane.setVisible(false); glassPane.setProgress(0); } }); downloader.start(); } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new GlassPaneInterceptEvent().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTable filesTable; // End of variables declaration//GEN-END:variables } /* * Copyright (c) 2007, Romain Guy * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the TimingFramework project nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * * @author Romain Guy */ class ProgressGlassPane extends JComponent { private static final int BAR_WIDTH = 200; private static final int BAR_HEIGHT = 10; private static final Color TEXT_COLOR = new Color(0x333333); private static final Color BORDER_COLOR = new Color(0x333333); private static final float[] GRADIENT_FRACTIONS = new float[] { 0.0f, 0.499f, 0.5f, 1.0f }; private static final Color[] GRADIENT_COLORS = new Color[] { Color.GRAY, Color.DARK_GRAY, Color.BLACK, Color.GRAY }; private static final Color GRADIENT_COLOR2 = Color.WHITE; private static final Color GRADIENT_COLOR1 = Color.GRAY; private String message = "Downloading file..."; private int progress = 0; /** Creates a new instance of ProgressGlassPane */ public ProgressGlassPane() { // blocks all user input addMouseListener(new MouseAdapter() { }); addMouseMotionListener(new MouseMotionAdapter() { }); addKeyListener(new KeyAdapter() { }); setFocusTraversalKeysEnabled(false); addComponentListener(new ComponentAdapter() { public void componentShown(ComponentEvent evt) { requestFocusInWindow(); } }); setBackground(Color.WHITE); setFont(new Font("Default", Font.BOLD, 16)); } public int getProgress() { return progress; } public void setProgress(int progress) { int oldProgress = this.progress; this.progress = progress; // computes the damaged area FontMetrics metrics = getGraphics().getFontMetrics(getFont()); int w = (int) (BAR_WIDTH * ((float) oldProgress / 100.0f)); int x = w + (getWidth() - BAR_WIDTH) / 2; int y = (getHeight() - BAR_HEIGHT) / 2; y += metrics.getDescent() / 2; w = (int) (BAR_WIDTH * ((float) progress / 100.0f)) - w; int h = BAR_HEIGHT; repaint(x, y, w, h); } @Override protected void paintComponent(Graphics g) { // enables anti-aliasing Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // gets the current clipping area Rectangle clip = g.getClipBounds(); // sets a 65% translucent composite AlphaComposite alpha = AlphaComposite.SrcOver.derive(0.65f); Composite composite = g2.getComposite(); g2.setComposite(alpha); // fills the background g2.setColor(getBackground()); g2.fillRect(clip.x, clip.y, clip.width, clip.height); // centers the progress bar on screen FontMetrics metrics = g.getFontMetrics(); int x = (getWidth() - BAR_WIDTH) / 2; int y = (getHeight() - BAR_HEIGHT - metrics.getDescent()) / 2; // draws the text g2.setColor(TEXT_COLOR); g2.drawString(message, x, y); // goes to the position of the progress bar y += metrics.getDescent(); // computes the size of the progress indicator int w = (int) (BAR_WIDTH * ((float) progress / 100.0f)); int h = BAR_HEIGHT; // draws the content of the progress bar Paint paint = g2.getPaint(); // bar's background Paint gradient = new GradientPaint(x, y, GRADIENT_COLOR1, x, y + h, GRADIENT_COLOR2); g2.setPaint(gradient); g2.fillRect(x, y, BAR_WIDTH, BAR_HEIGHT); // actual progress gradient = new LinearGradientPaint(x, y, x, y + h, GRADIENT_FRACTIONS, GRADIENT_COLORS); g2.setPaint(gradient); g2.fillRect(x, y, w, h); g2.setPaint(paint); // draws the progress bar border g2.drawRect(x, y, BAR_WIDTH, BAR_HEIGHT); g2.setComposite(composite); } }
1. | Add Image To GlassPane | ![]() | |
2. | GlassPane Drag Drop | ![]() | |
3. | Glasspane Painting | ![]() |