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 + -
显示快捷键?