synthprogressbarui.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,230 行 · 第 1/3 页

JAVA
1,230
字号
/* * @(#)SynthProgressBarUI.java	1.15 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.java.swing.plaf.gtk;import java.awt.*;import java.awt.geom.AffineTransform;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.plaf.*;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import java.io.Serializable;//PENDING (kwalrath): Convert to logging, add assertions.//PENDING (kwalrath): Make sure vertical is handled.//PENDING (kwalrath): Should right-to-left indeterminate progress bar be//                    handled differently?//PENDING (kwalrath): Make sure method overriding is safe (esp. for ivars).//PENDING (kwalrath): Support program-driven frame incrementation?/** * A Synth L&F implementation of ProgressBarUI. * * @version 1.15, 01/23/03 (originally from version 1.60 of BasicProgressBarUI) * @author Michael C. Albers * @author Kathy Walrath * @author Joshua Outwater */class SynthProgressBarUI extends ProgressBarUI implements SynthUI {        private static final Dimension PREFERRED_INNER_HORIZONTAL =        new Dimension(146, 16);    private static final Dimension PREFERRED_INNER_VERTICAL =        new Dimension(16, 146);    private SynthStyle style;    private int cachedPercent;    private int cellLength, cellSpacing;    // The "selectionForeground" is the color of the text when it is painted    // over a filled area of the progress bar. The "selectionBackground"    // is for the text over the unfilled progress bar area.    private Color selectionForeground, selectionBackground;    private boolean isIndeterminate = false;    private Animator animator;     private PropertyChangeListener propertyListener;    protected JProgressBar progressBar;    protected ChangeListener changeListener;    /**      * The current state of the indeterminate animation's cycle.     * 0, the initial value, means paint the first frame.     * When the progress bar is indeterminate and showing,     * the default animation thread updates this variable     * by invoking incrementAnimationIndex()     * every repaintInterval milliseconds.     */    private int animationIndex = 0;    /**     * The number of frames per cycle. Under the default implementation,     * this depends on the cycleTime and repaintInterval.  It     * must be an even number for the default painting algorithm.  This     * value is set in the initIndeterminateValues method.     */    private int numFrames;   //0 1|numFrames-1 ... numFrames/2    /**     * Interval (in ms) between repaints of the indeterminate progress bar.     * The value of this method is set      * (every time the progress bar changes to indeterminate mode)     * using the      * "ProgressBar.repaintInterval" key in the defaults table.     */    private int repaintInterval;    /**     * The number of milliseconds until the animation cycle repeats.     * The value of this method is set      * (every time the progress bar changes to indeterminate mode)     * using the      * "ProgressBar.cycleTime" key in the defaults table.     */    private int cycleTime;  //must be repaintInterval*2*aPositiveInteger    //performance stuff    private static boolean ADJUSTTIMER = true; //makes a BIG difference;    //make this false for    //performance tests    //debugging; PENDING (kwalrath): convert to logging API     private static boolean DEBUGALL = false;  //severe performance impact    private static boolean DEBUGTIMER = false;  //severe performance impact    private static boolean BASICDEBUG = false;    //performance data collection    private static boolean LOGSTATS = false;    private long startTime = 0;    private long lastLoopTime = 0;    private int numLoops = 0;    /**                                                                  * Used to hold the location and size of the bouncing box (returned     * by getBox) to be painted.       */                                                                 private Rectangle boxRect;                                                                        /**                                                                  * The rectangle to be updated the next time the              * animation thread calls repaint.  For bouncing-box                 * animation this rect should include the union of         * the currently displayed box (which needs to be erased)            * and the box to be displayed next.     * This rectangle's values are set in      * the setAnimationIndex method.     */                                                                 private Rectangle nextPaintRect;    //cache    /** The component's painting area, not including the border. */    private Rectangle componentInnards;    //the current painting area    private Rectangle oldComponentInnards; //used to see if the size changed    /** For bouncing-box animation, the change in position per frame. */    private double delta = 0.0;    private int maxPosition = 0; //maximum X (horiz) or Y box location    public static ComponentUI createUI(JComponent x) {        return new SynthProgressBarUI();    }    public void installUI(JComponent c) {        progressBar = (JProgressBar)c;        installDefaults();        installListeners();    }    public void uninstallUI(JComponent c) {        uninstallDefaults();        uninstallListeners();        stopAnimationTimer();        progressBar = null;    }    protected void installDefaults() {        fetchStyle(progressBar);    }    private void fetchStyle(JProgressBar c) {        SynthContext context = getContext(c, ENABLED);        SynthStyle oldStyle = style;        style = SynthLookAndFeel.updateStyle(context, this);        // Add properties other than JComponent colors, Borders and        // opacity settings here:        if (style != oldStyle) {            cellLength = UIManager.getInt("ProgressBar.cellLength");            cellSpacing = UIManager.getInt("ProgressBar.cellSpacing");            selectionForeground =                UIManager.getColor("ProgressBar.selectionForeground");            selectionBackground =                UIManager.getColor("ProgressBar.selectionBackground");        }        context.dispose();    }        protected void uninstallDefaults() {        SynthContext context = getContext(progressBar, ENABLED);        style.uninstallDefaults(context);        context.dispose();        style = null;    }        protected void installListeners() {        //Listen for changes in the progress bar's data.        changeListener = new ChangeHandler();        progressBar.addChangeListener(changeListener);        //Listen for changes between determinate and indeterminate state.        propertyListener = new PropertyChangeHandler();        progressBar.addPropertyChangeListener(propertyListener);    }            public SynthContext getContext(JComponent c) {        return getContext(c, getComponentState(c));    }    private SynthContext getContext(JComponent c, int state) {        return SynthContext.getContext(SynthContext.class, c,                            SynthLookAndFeel.getRegion(c), style, state);    }    private Region getRegion(JComponent c) {        return SynthLookAndFeel.getRegion(c);    }    private int getComponentState(JComponent c) {        return SynthLookAndFeel.getComponentState(c);    }    /**     * Starts the animation thread, creating and initializing     * it if necessary.  This method is invoked when     * the progress bar changes to indeterminate mode.      * If you implement your own animation thread,     * you must override this method.     *     * @since 1.4     */    protected void startAnimationTimer() {        if (animator == null) {            animator = new Animator();         }        animator.start(getRepaintInterval());    }    /**     * Stops the animation thread.  This method is invoked when     * the progress bar changes from      * indeterminate to determinate mode     * and when this UI is uninstalled.     * If you implement your own animation thread,     * you must override this method.     *     * @since 1.4     */    protected void stopAnimationTimer() {        if (animator != null) {            animator.stop();        }    }    /**     * Removes all listeners installed by this object.     */    protected void uninstallListeners() {        progressBar.removeChangeListener(changeListener);        progressBar.removePropertyChangeListener(propertyListener);    }        // Many of the Synth*UI components have the following methods.    // This component does not have these methods because *ProgressBarUI    //  is not a compound component and does not accept input.    //    // protected void installComponents()    // protected void uninstallComponents()    // protected void installKeyboardActions()    // protected void uninstallKeyboardActions()    protected Dimension getPreferredInnerHorizontal() {        return PREFERRED_INNER_HORIZONTAL;    }        protected Dimension getPreferredInnerVertical() {        return PREFERRED_INNER_VERTICAL;    }        /**     * The "selectionForeground" is the color of the text when it is painted     * over a filled area of the progress bar.     */    protected Color getSelectionForeground() {        return selectionForeground;    }        /**     * The "selectionBackground" is the color of the text when it is painted     * over an unfilled area of the progress bar.     */    protected Color getSelectionBackground() {        return selectionBackground;    }        private int getCachedPercent() {        return cachedPercent;    }        private void setCachedPercent(int cachedPercent) {        this.cachedPercent = cachedPercent;    }        /**     * Returns the width (if HORIZONTAL) or height (if VERTICAL)     * of each of the indivdual cells/units to be rendered in the     * progress bar. However, for text rendering simplification and      * aesthetic considerations, this function will return 1 when     * the progress string is being rendered.     *     * @return the value representing the spacing between cells     * @see    #setCellLength     * @see    JProgressBar#isStringPainted     */    protected int getCellLength() {        if (progressBar.isStringPainted()) {            return 1;        } else {            return cellLength;        }    }        protected void setCellLength(int cellLen) {        this.cellLength = cellLen;    }        /**     * Returns the spacing between each of the cells/units in the     * progress bar. However, for text rendering simplification and      * aesthetic considerations, this function will return 0 when     * the progress string is being rendered.     *     * @return the value representing the spacing between cells     * @see    #setCellSpacing     * @see    JProgressBar#isStringPainted     */    protected int getCellSpacing() {        if (progressBar.isStringPainted()) {            return 0;        } else {            return cellSpacing;        }    }        protected void setCellSpacing(int cellSpace) {        this.cellSpacing = cellSpace;    }        /**     * This determines the amount of the progress bar that should be filled     * based on the percent done gathered from the model. This is a common     * operation so it was abstracted out. It assumes that your progress bar     * is linear. That is, if you are making a circular progress indicator,     * you will want to override this method.     */    protected int getAmountFull(Insets b, int width, int height) {        int amountFull = 0;        BoundedRangeModel model = progressBar.getModel();                if ( (model.getMaximum() - model.getMinimum()) != 0) {            if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) {                amountFull = (int)Math.round(width *                             progressBar.getPercentComplete());            } else {                amountFull = (int)Math.round(height *                             progressBar.getPercentComplete());            }        }        return amountFull;    }        public void update(Graphics g, JComponent c) {        SynthContext context = getContext(c);        SynthLookAndFeel.update(context, g);        paint(context, g);        context.dispose();    }    public void paint(Graphics g, JComponent c) {        SynthContext context = getContext(c);        paint(context, g);        context.dispose();    }    protected void paint(SynthContext context, Graphics g) {        JProgressBar pBar = (JProgressBar)context.getComponent();        Rectangle progressBounds = new Rectangle();        if (!pBar.isIndeterminate()) {            Insets pBarInsets = pBar.getInsets();            double percentComplete = pBar.getPercentComplete();            if (percentComplete != 0.0) {                if (pBar.getOrientation() == JProgressBar.HORIZONTAL) {                    progressBounds.x = pBarInsets.left;                    progressBounds.y = pBarInsets.top;                    // The +1 on each side is the insets of the progress.                    progressBounds.width =                        (int)(percentComplete * (pBar.getWidth()                            - (pBarInsets.left + 1 + pBarInsets.right + 1)));                    progressBounds.height = pBar.getHeight()                        - (pBarInsets.top + 1 + pBarInsets.bottom + 1);                    if (!SynthLookAndFeel.isLeftToRight(pBar)) {                        progressBounds.x =                            pBar.getWidth() - pBarInsets.left                                - pBarInsets.right - progressBounds.width;                    }                } else {  // JProgressBar.VERTICAL                    progressBounds.x = pBarInsets.left;                    progressBounds.width = pBar.getWidth()                        - (pBarInsets.left + 1 + pBarInsets.right + 1);                    progressBounds.height =                        (int)(percentComplete * (pBar.getHeight()                            - (pBarInsets.top + 1 + pBarInsets.bottom + 1)));                    progressBounds.y =                        pBar.getHeight() - pBarInsets.top - pBarInsets.bottom                            - progressBounds.height;                    // When the progress bar is vertical we always paint                    // from bottom to top, not matter what the component

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?