basicprogressbarui.java

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· Java 代码 · 共 826 行 · 第 1/2 页

JAVA
826
字号
  /**   * This method returns the Color that the text is shown in when the bar is   * not over the text.   *   * @return The color of the text when the bar is not over it.   */  protected Color getSelectionBackground()  {    return selectionBackground;  }  /**   * This method returns the Color that the text is shown in  when the bar is   * over the text.   *   * @return The color of the text when the bar is over it.   */  protected Color getSelectionForeground()  {    return selectionForeground;  }  /**   * This method returns the point (the top left of the bounding box)   * where the text should be painted.    *   * @param g The Graphics object to measure FontMetrics with.   * @param progressString The string to paint.   * @param x The x coordinate of the overall bounds box.   * @param y The y coordinate of the overall bounds box.   * @param width The width of the overall bounds box.   * @param height The height of the overall bounds box.   *   * @return The top left of the bounding box where text should be painted.   */  protected Point getStringPlacement(Graphics g, String progressString, int x,                                     int y, int width, int height)  {    Rectangle tr = new Rectangle();    Rectangle vr = new Rectangle(x, y, width, height);    Rectangle ir = new Rectangle();    Font f = g.getFont();    FontMetrics fm = g.getFontMetrics(f);    SwingUtilities.layoutCompoundLabel(progressBar, fm, progressString, null,                                       SwingConstants.CENTER,                                       SwingConstants.CENTER,                                       SwingConstants.CENTER,                                       SwingConstants.CENTER, vr, ir, tr, 0);    return new Point(tr.x, tr.y);  }  /**   * This method increments the animation index.   */  protected void incrementAnimationIndex()  {    animationIndex++;    //numFrames is like string length, it should be named numFrames or something    if (animationIndex >= numFrames)      animationIndex = 0;    progressBar.repaint();  }  /**   * This method paints the progressBar. It delegates its responsibilities   * to paintDeterminate and paintIndeterminate.   *   * @param g The Graphics object to paint with.   * @param c The JComponent to paint.   */  public void paint(Graphics g, JComponent c)  {    if (! progressBar.isIndeterminate())      paintDeterminate(g, c);    else      paintIndeterminate(g, c);          if (progressBar.isBorderPainted())      progressBar.getBorder().paintBorder(progressBar, g, 0, 0,                                          progressBar.getWidth(),					  progressBar.getHeight());  }  /**   * This method is called if the painting to be done is    * for a determinate progressBar.   *   * @param g The Graphics object to paint with.   * @param c The JComponent to paint.   */  protected void paintDeterminate(Graphics g, JComponent c)  {    Color saved = g.getColor();    int space = getCellSpacing();    int len = getCellLength();    int max = progressBar.getMaximum();    int min = progressBar.getMinimum();    int value = progressBar.getValue();    Rectangle vr = new Rectangle();    SwingUtilities.calculateInnerArea(c, vr);    Rectangle or = c.getBounds();    Insets insets = c.getInsets();    int amountFull = getAmountFull(insets, or.width, or.height);    g.setColor(c.getBackground());    g.fill3DRect(vr.x, vr.y, vr.width, vr.height, false);    if (max != min && len != 0 && value > min)      {	int iterations = value / (space + len);	if (progressBar.getOrientation() == JProgressBar.HORIZONTAL)	  {	    double spaceInUnits = space * (double) vr.width / (max - min);	    double lenInUnits = len * (double) vr.width / (max - min);	    double currX = vr.x;	    g.setColor(c.getForeground());	    g.fill3DRect(vr.x, vr.y, amountFull, vr.height, true);	    g.setColor(c.getBackground());	    if (spaceInUnits != 0)	      {		for (int i = 0; i < iterations; i++)		  {		    currX += lenInUnits;		    g.fill3DRect((int) currX, vr.y, (int) spaceInUnits,		                 vr.height, true);		    currX += spaceInUnits;		  }	      }	  }	else	  {	    double currY = vr.y;	    double spaceInUnits = space * (double) vr.height / (max - min);	    double lenInUnits = len * (double) vr.height / (max - min);	    g.setColor(c.getForeground());	    g.fill3DRect(vr.x, vr.y + vr.height - amountFull, vr.width,	                 amountFull, true);	    g.setColor(c.getBackground());	    if (spaceInUnits != 0)	      {		for (int i = 0; i < iterations; i++)		  {		    currY -= lenInUnits + spaceInUnits;		    g.fill3DRect(vr.x, (int) currY, vr.width,		                 (int) spaceInUnits, true);		  }	      }	  }      }    if (progressBar.isStringPainted() && !progressBar.getString().equals(""))      paintString(g, 0, 0, or.width, or.height, amountFull, insets);    g.setColor(saved);  }  /**   * This method is called if the painting to be done is for   * an indeterminate progressBar.   *   * @param g The Graphics object to paint with.   * @param c The JComponent to paint.   */  protected void paintIndeterminate(Graphics g, JComponent c)  {    //need to paint the box at it's current position. no text is painted since    //all we're doing is bouncing back and forth    Color saved = g.getColor();    Insets insets = c.getInsets();    Rectangle or = c.getBounds();    Rectangle vr = new Rectangle();    SwingUtilities.calculateInnerArea(c, vr);    g.setColor(c.getBackground());    g.fill3DRect(vr.x, vr.y, vr.width, vr.height, false);    Rectangle box = new Rectangle();    getBox(box);    g.setColor(c.getForeground());    g.fill3DRect(box.x, box.y, box.width, box.height, true);    if (progressBar.isStringPainted() && !progressBar.getString().equals(""))      paintString(g, 0, 0, or.width, or.height,                  getAmountFull(insets, or.width, or.height), insets);    g.setColor(saved);  }  /**   * This method paints the string for the progressBar.   *   * @param g The Graphics object to paint with.   * @param x The x coordinate of the progressBar.   * @param y The y coordinate of the progressBar.   * @param width The width of the progressBar.   * @param height The height of the progressBar.   * @param amountFull The amount of the progressBar that has its bar filled.   * @param b The insets of the progressBar.   */  protected void paintString(Graphics g, int x, int y, int width, int height,                             int amountFull, Insets b)  {    // We want to place in the exact center of the bar.    Point placement = getStringPlacement(g, progressBar.getString(),                                         x + b.left, y + b.top,                                         width - b.left - b.right,                                         height - b.top - b.bottom);    Color saved = g.getColor();    // FIXME: The Color of the text should use selectionForeground and selectionBackground    // but that can't be done right now, so we'll use white in the mean time.    g.setColor(Color.WHITE);    FontMetrics fm = g.getFontMetrics(progressBar.getFont());    g.drawString(progressBar.getString(), placement.x,                 placement.y + fm.getAscent());    g.setColor(saved);  }  /**   * This method sets the current animation index. If the index   * is greater than the number of frames, it resets to 0.   *   * @param newValue The new animation index.   */  protected void setAnimationIndex(int newValue)  {    animationIndex = (newValue <= numFrames) ? newValue : 0;    progressBar.repaint();  }  /**   * This method sets the cell length.   *   * @param cellLen The cell length.   */  protected void setCellLength(int cellLen)  {    cellLength = cellLen;  }  /**   * This method sets the cell spacing.   *   * @param cellSpace The cell spacing.   */  protected void setCellSpacing(int cellSpace)  {    cellSpacing = cellSpace;  }  /**   * This method starts the animation timer. It is called   * when the propertyChangeListener detects that the progressBar   * has changed to indeterminate mode.   *   * @since 1.4   */  protected void startAnimationTimer()  {    if (animationTimer != null)      animationTimer.start();  }  /**   * This method stops the animation timer. It is called when   * the propertyChangeListener detects that the progressBar   * has changed to determinate mode.   *   * @since 1.4   */  protected void stopAnimationTimer()  {    if (animationTimer != null)      animationTimer.stop();    setAnimationIndex(0);  }  /**   * This method changes the settings for the progressBar to   * the defaults provided by the current Look and Feel.   */  protected void installDefaults()  {    UIDefaults defaults = UIManager.getLookAndFeelDefaults();    progressBar.setFont(defaults.getFont("ProgressBar.font"));    progressBar.setForeground(defaults.getColor("ProgressBar.foreground"));    progressBar.setBackground(defaults.getColor("ProgressBar.background"));    progressBar.setBorder(defaults.getBorder("ProgressBar.border"));    progressBar.setOpaque(true);    selectionForeground = defaults.getColor("ProgressBar.selectionForeground");    selectionBackground = defaults.getColor("ProgressBar.selectionBackground");    cellLength = defaults.getInt("ProgressBar.cellLength");    cellSpacing = defaults.getInt("ProgressBar.cellSpacing");    int repaintInterval = defaults.getInt("ProgressBar.repaintInterval");    int cycleTime = defaults.getInt("ProgressBar.cycleTime");    if (cycleTime % repaintInterval != 0        && (cycleTime / repaintInterval) % 2 != 0)      {	int div = (cycleTime / repaintInterval) + 2;	div /= 2;	div *= 2;	cycleTime = div * repaintInterval;      }    setAnimationIndex(0);    numFrames = cycleTime / repaintInterval;    animationTimer.setDelay(repaintInterval);  }  /**   * The method uninstalls any defaults that were   * set by the current Look and Feel.   */  protected void uninstallDefaults()  {    progressBar.setFont(null);    progressBar.setForeground(null);    progressBar.setBackground(null);    selectionForeground = null;    selectionBackground = null;  }  /**   * This method registers listeners to all the    * components that this UI delegate needs to listen to.   */  protected void installListeners()  {    changeListener = new ChangeHandler();    propertyListener = new PropertyChangeHandler();    animation = new Animator();    progressBar.addChangeListener(changeListener);    progressBar.addPropertyChangeListener(propertyListener);    animationTimer.addActionListener(animation);  }  /**   * This method unregisters listeners to all the    * components that were listened to.   */  protected void uninstallListeners()  {    progressBar.removeChangeListener(changeListener);    progressBar.removePropertyChangeListener(propertyListener);    animationTimer.removeActionListener(animation);    changeListener = null;    propertyListener = null;    animation = null;  }  /**   * This method installs the UI for the given JComponent.   * This includes setting up defaults and listeners as   * well as initializing any values or objects that   * the UI may need.   *   * @param c The JComponent that is having this UI installed.   */  public void installUI(JComponent c)  {    super.installUI(c);    if (c instanceof JProgressBar)      {	progressBar = (JProgressBar) c;	animationTimer = new Timer(200, null);	animationTimer.setRepeats(true);	installDefaults();	installListeners();      }  }  /**   * This method removes the UI for the given JComponent.   * This includes removing any listeners or defaults   * that the installUI may have set up.   *   * @param c The JComponent that is having this UI uninstalled.   */  public void uninstallUI(JComponent c)  {    super.uninstallUI(c);    uninstallListeners();    uninstallDefaults();    animationTimer = null;    progressBar = null;  }}

⌨️ 快捷键说明

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