📄 basicprogressbarui.java
字号:
ret = getPreferredInnerHorizontal(); ret.width = 10; ret.height += insets.top + insets.bottom; } return ret; } /** * This method returns the preferred size of the inner * rectangle (the bounds without the insets) if the * progressBar is horizontal. * * @return The preferred size of the progressBar minus * insets if it's horizontal. */ protected Dimension getPreferredInnerHorizontal() { Font font = progressBar.getFont(); FontMetrics fm = progressBar.getFontMetrics(font); int stringWidth = 0; String str = progressBar.getString(); if (str != null) stringWidth = fm.stringWidth(progressBar.getString()); Insets i = progressBar.getInsets(); int prefWidth = Math.max(200 - i.left - i.right, stringWidth); int stringHeight = 0; if (str != null) stringHeight = fm.getHeight(); int prefHeight = Math.max(16 - i.top - i.bottom, stringHeight); return new Dimension(prefWidth, prefHeight); } /** * This method returns the preferred size of the inner * rectangle (the bounds without insets) if the * progressBar is vertical. * * @return The preferred size of the progressBar minus * insets if it's vertical. */ protected Dimension getPreferredInnerVertical() { Font font = progressBar.getFont(); FontMetrics fm = progressBar.getFontMetrics(font); int stringWidth = 0; String str = progressBar.getString(); if (str != null) stringWidth = fm.stringWidth(progressBar.getString()); Insets i = progressBar.getInsets(); int prefHeight = Math.max(200 - i.left - i.right, stringWidth); int stringHeight = 0; if (str != null) stringHeight = fm.getHeight(); int prefWidth = Math.max(16 - i.top - i.bottom, stringHeight); return new Dimension(prefWidth, prefHeight); } /** * This method returns the preferred size of the * given JComponent. If it returns null, then it * is up to the LayoutManager to give it a size. * * @param c The component to find the preferred size for. * * @return The preferred size of the component. */ public Dimension getPreferredSize(JComponent c) { Insets insets = c.getInsets(); Dimension ret; int orientation = progressBar.getOrientation(); if (orientation == JProgressBar.VERTICAL) ret = getPreferredInnerVertical(); else ret = getPreferredInnerHorizontal(); ret.width += insets.left + insets.right; ret.height += insets.top + insets.bottom; return ret; } /** * 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); } /** * 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 = SwingUtilities.calculateInnerArea(c, new Rectangle()); Rectangle or = progressBar.getBounds(); Insets insets = c.getInsets(); int amountFull = getAmountFull(insets, or.width, or.height); if (progressBar.getOrientation() == JProgressBar.HORIZONTAL) { g.setColor(c.getForeground()); g.fillRect(vr.x, vr.y, amountFull, vr.height); } else { g.setColor(c.getForeground()); g.fillRect(vr.x, vr.y + vr.height - amountFull, vr.width, amountFull); } 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.fillRect(vr.x, vr.y, vr.width, vr.height); boxRect = getBox(boxRect); g.setColor(c.getForeground()); g.fillRect(boxRect.x, boxRect.y, boxRect.width, boxRect.height); 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) { // FIXME: We do not support vertical text painting because Java2D is needed // for this. if (progressBar.getOrientation() == JProgressBar.VERTICAL) return; // 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 savedColor = g.getColor(); Shape savedClip = g.getClip(); FontMetrics fm = g.getFontMetrics(progressBar.getFont()); int full = getAmountFull(b, width, height); String str = progressBar.getString(); // We draw this string two times with different clips so that the text // over the filled area is painted with selectionForeground and over // the clear area with selectionBackground. g.setColor(getSelectionForeground()); g.setClip(0, 0, full + b.left, height); g.drawString(str, placement.x, placement.y + fm.getAscent()); g.setColor(getSelectionBackground()); g.setClip(full + b.left, 0, width - full, height); g.drawString(str, placement.x, placement.y + fm.getAscent()); g.setClip(savedClip); g.setColor(savedColor); } /** * 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() { LookAndFeel.installColorsAndFont(progressBar, "ProgressBar.background", "ProgressBar.foreground", "ProgressBar.font"); LookAndFeel.installBorder(progressBar, "ProgressBar.border"); progressBar.setOpaque(true); selectionForeground = UIManager.getColor("ProgressBar.selectionForeground"); selectionBackground = UIManager.getColor("ProgressBar.selectionBackground"); cellLength = UIManager.getInt("ProgressBar.cellLength"); cellSpacing = UIManager.getInt("ProgressBar.cellSpacing"); int repaintInterval = UIManager.getInt("ProgressBar.repaintInterval"); int cycleTime = UIManager.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); ancestorListener = new AncestorHandler(); progressBar.addAncestorListener(ancestorListener); componentListener = new ComponentHandler(); progressBar.addComponentListener(componentListener); } /** * 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; if (ancestorListener != null) progressBar.removeAncestorListener(ancestorListener); ancestorListener = null; if (componentListener != null) progressBar.removeComponentListener(componentListener); componentListener = 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(); } if (progressBar.isIndeterminate()) startAnimationTimer(); } /** * 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -