synthscrollpaneui.java

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

JAVA
994
字号
	JViewport viewport = scrollpane.getViewport();	JScrollBar vsb = scrollpane.getVerticalScrollBar();	JScrollBar hsb = scrollpane.getHorizontalScrollBar();	JViewport rowHead = scrollpane.getRowHeader();	JViewport colHead = scrollpane.getColumnHeader();	boolean ltr = scrollpane.getComponentOrientation().isLeftToRight();	if (viewport != null) {	    Dimension extentSize = viewport.getExtentSize();	    Dimension viewSize = viewport.getViewSize();	    Point viewPosition = viewport.getViewPosition();	    if (vsb != null) {		int extent = extentSize.height;		int max = viewSize.height;		int value = Math.max(0, Math.min(viewPosition.y, max - extent));		vsb.setValues(value, extent, 0, max);	    }	    if (hsb != null) {		int extent = extentSize.width;		int max = viewSize.width;		int value;		if (ltr) {		    value = Math.max(0, Math.min(viewPosition.x, max - extent));		} else {		    int currentValue = hsb.getValue();		    /* Use a particular formula to calculate "value"		     * until effective x coordinate is calculated.		     */		    if (setValueCalled && ((max - currentValue) == viewPosition.x)) {			value = Math.max(0, Math.min(max - extent, currentValue));			/* After "extent" is set, turn setValueCalled flag off.			 */			if (extent != 0) {			    setValueCalled = false;			}		    } else {			if (extent > max) {			    viewPosition.x = max - extent;			    viewport.setViewPosition(viewPosition);			    value = 0;			} else {			   /* The following line can't handle a small value of			    * viewPosition.x like Integer.MIN_VALUE correctly			    * because (max - extent - viewPositoiin.x) causes			    * an overflow. As a result, value becomes zero.			    * (e.g. setViewPosition(Integer.MAX_VALUE, ...)			    *       in a user program causes a overflow.			    *       Its expected value is (max - extent).)			    * However, this seems a trivial bug and adding a			    * fix makes this often-called method slow, so I'll			    * leave it until someone claims.			    */			    value = Math.max(0, Math.min(max - extent, max - extent - viewPosition.x));			}		    }		}		hsb.setValues(value, extent, 0, max);	    }	    if (rowHead != null) {		Point p = rowHead.getViewPosition();		p.y = viewport.getViewPosition().y;                p.x = 0;		rowHead.setViewPosition(p);	    }	    if (colHead != null) {		Point p = colHead.getViewPosition();		if (ltr) {		    p.x = viewport.getViewPosition().x;		} else {		    p.x = Math.max(0, viewport.getViewPosition().x);		}                p.y = 0;		colHead.setViewPosition(p);	    }	}    }    /**     * Listener for viewport events.     */    class ViewportChangeHandler implements ChangeListener    {	public void stateChanged(ChangeEvent e) {	    syncScrollPaneWithViewport();	}    }    protected ChangeListener createViewportChangeListener() {	return new ViewportChangeHandler();    }    /**     * Horizontal scrollbar listener.     */    class HSBChangeListener implements ChangeListener    {	public void stateChanged(ChangeEvent e)	{	    JViewport viewport = scrollpane.getViewport();	    if (viewport != null) {		BoundedRangeModel model = (BoundedRangeModel)(e.getSource());		Point p = viewport.getViewPosition();		int value = model.getValue();		if (scrollpane.getComponentOrientation().isLeftToRight()) {		    p.x = value;		} else {		    int max = viewport.getViewSize().width;		    int extent = viewport.getExtentSize().width;		    int oldX = p.x;		    /* Set new X coordinate based on "value".		     */		    p.x = max - extent - value;		    /* If setValue() was called before "extent" was fixed,		     * turn setValueCalled flag on.		     */		    if ((extent == 0) && (value != 0) && (oldX == max)) {			setValueCalled = true;		    } else {			/* When a pane without a horizontal scroll bar was			 * reduced and the bar appeared, the viewport should			 * show the right side of the view.			 */			if ((extent != 0) && (oldX < 0) && (p.x == 0)) {			    p.x += value;			}		    }		}		viewport.setViewPosition(p);	    }	}    }    /**     * Returns a <code>PropertyChangeListener</code> that will be installed     * on the horizontal <code>JScrollBar</code>.     */    private PropertyChangeListener createHSBPropertyChangeListener() {        return getSBPropertyChangeListener();    }    /**     * Returns a shared <code>PropertyChangeListener</code> that will update     * the listeners installed on the scrollbars as the model changes.     */    private PropertyChangeListener getSBPropertyChangeListener() {        if (sbPropertyChangeListener == null) {            sbPropertyChangeListener = new ScrollBarPropertyChangeHandler();        }        return sbPropertyChangeListener;    }    protected ChangeListener createHSBChangeListener() {	return new HSBChangeListener();    }    /**     * Vertical scrollbar listener.     */    class VSBChangeListener implements ChangeListener    {	public void stateChanged(ChangeEvent e)	{	    JViewport viewport = scrollpane.getViewport();	    if (viewport != null) {		BoundedRangeModel model = (BoundedRangeModel)(e.getSource());		Point p = viewport.getViewPosition();		p.y = model.getValue();		viewport.setViewPosition(p);	    }	}    }    /**     * PropertyChangeListener for the ScrollBars.     */    private class ScrollBarPropertyChangeHandler implements                               PropertyChangeListener {        // Listens for changes in the model property and reinstalls the        // horizontal/vertical PropertyChangeListeners.        public void propertyChange(PropertyChangeEvent e) {            String propertyName = e.getPropertyName();            Object source = e.getSource();            if ("model".equals(propertyName)) {                JScrollBar sb = scrollpane.getVerticalScrollBar();                BoundedRangeModel oldModel = (BoundedRangeModel)e.                                     getOldValue();                ChangeListener cl = null;                if (source == sb) {                    cl = vsbChangeListener;                }                else if (source == scrollpane.getHorizontalScrollBar()) {                    sb = scrollpane.getHorizontalScrollBar();                    cl = hsbChangeListener;                }                if (cl != null) {                    if (oldModel != null) {                        oldModel.removeChangeListener(cl);                    }                    if (sb.getModel() != null) {                        sb.getModel().addChangeListener(cl);                    }                }            }            else if ("componentOrientation".equals(propertyName)) {                if (source == scrollpane.getHorizontalScrollBar()) {		    JScrollBar hsb = scrollpane.getHorizontalScrollBar(); 		    JViewport viewport = scrollpane.getViewport();                    Point p = viewport.getViewPosition();                    if (scrollpane.getComponentOrientation().isLeftToRight()) {                        p.x = hsb.getValue();                    } else {                        p.x = viewport.getViewSize().width - viewport.getExtentSize().width - hsb.getValue();                    }                    viewport.setViewPosition(p);                }            }        }    }    /**     * Returns a <code>PropertyChangeListener</code> that will be installed     * on the vertical <code>JScrollBar</code>.     */    private PropertyChangeListener createVSBPropertyChangeListener() {        return getSBPropertyChangeListener();    }    protected ChangeListener createVSBChangeListener() {	return new VSBChangeListener();    }    /**     * MouseWheelHandler is an inner class which implements the      * MouseWheelListener interface.  MouseWheelHandler responds to      * MouseWheelEvents by scrolling the JScrollPane appropriately.     * If the scroll pane's     * <code>isWheelScrollingEnabled</code>     * method returns false, no scrolling occurs.     *      * @see javax.swing.JScrollPane#isWheelScrollingEnabled     * @see #createMouseWheelListener     * @see java.awt.event.MouseWheelListener     * @see java.awt.event.MouseWheelEvent     * @since 1.4     */    protected class MouseWheelHandler implements MouseWheelListener {        /**         * Called when the mouse wheel is rotated while over a         * JScrollPane.         *         * @param e     MouseWheelEvent to be handled         * @since 1.4         */        public void mouseWheelMoved(MouseWheelEvent e) {            if (scrollpane.isWheelScrollingEnabled() &&                e.getScrollAmount() != 0) {                JScrollBar toScroll = scrollpane.getVerticalScrollBar();                int direction = 0;                // find which scrollbar to scroll, or return if none                if (toScroll == null || !toScroll.isVisible()) {                     toScroll = scrollpane.getHorizontalScrollBar();                    if (toScroll == null || !toScroll.isVisible()) {                         return;                    }                }                direction = e.getWheelRotation() < 0 ? -1 : 1;                if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {                    SynthScrollBarUI.scrollByUnits(toScroll, direction,                                                         e.getScrollAmount());                }                else if (e.getScrollType() ==                         MouseWheelEvent.WHEEL_BLOCK_SCROLL) {                    SynthScrollBarUI.scrollByBlock(toScroll, direction);                }            }        }    }    /**     * Creates an instance of MouseWheelListener, which is added to the     * JScrollPane by installUI().  The returned MouseWheelListener is used     * to handle mouse wheel-driven scrolling.     *     * @return      MouseWheelListener which implements wheel-driven scrolling     * @see #installUI     * @see MouseWheelHandler     * @since 1.4     */    protected MouseWheelListener createMouseWheelListener() {        return new MouseWheelHandler();    }    protected void updateScrollBarDisplayPolicy(PropertyChangeEvent e) {	scrollpane.revalidate();	scrollpane.repaint();    }    protected void updateViewport(PropertyChangeEvent e)     {	JViewport oldViewport = (JViewport)(e.getOldValue());	JViewport newViewport = (JViewport)(e.getNewValue());	if (oldViewport != null) {	    oldViewport.removeChangeListener(viewportChangeListener);	}		if (newViewport != null) {	    Point p = newViewport.getViewPosition();	    if (scrollpane.getComponentOrientation().isLeftToRight()) {		p.x = Math.max(p.x, 0);	    } else {		int max = newViewport.getViewSize().width;		int extent = newViewport.getExtentSize().width;		if (extent > max) {		    p.x = max - extent;		} else {		    p.x = Math.max(0, Math.min(max - extent, p.x));

⌨️ 快捷键说明

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