basicscrollpaneui.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 948 行 · 第 1/3 页

JAVA
948
字号
            else if (key == SCROLL_DOWN) {                scroll(scrollPane, SwingConstants.VERTICAL, 1, true);            }            else if (key == SCROLL_HOME) {                scrollHome(scrollPane);            }            else if (key == SCROLL_END) {                scrollEnd(scrollPane);            }            else if (key == UNIT_SCROLL_UP) {                scroll(scrollPane, SwingConstants.VERTICAL, -1, false);            }            else if (key == UNIT_SCROLL_DOWN) {                scroll(scrollPane, SwingConstants.VERTICAL, 1, false);            }            else if (key == SCROLL_LEFT) {                scroll(scrollPane, SwingConstants.HORIZONTAL, ltr ? -1 : 1,                       true);            }            else if (key == SCROLL_RIGHT) {                scroll(scrollPane, SwingConstants.HORIZONTAL, ltr ? 1 : -1,                       true);            }            else if (key == UNIT_SCROLL_LEFT) {                scroll(scrollPane, SwingConstants.HORIZONTAL, ltr ? -1 : 1,                       false);            }            else if (key == UNIT_SCROLL_RIGHT) {                scroll(scrollPane, SwingConstants.HORIZONTAL, ltr ? 1 : -1,                       false);            }        }        private void scrollEnd(JScrollPane scrollpane) {	    JViewport vp = scrollpane.getViewport();	    Component view;	    if (vp != null && (view = vp.getView()) != null) {		Rectangle visRect = vp.getViewRect();		Rectangle bounds = view.getBounds();		if (scrollpane.getComponentOrientation().isLeftToRight()) {		    vp.setViewPosition(new Point(bounds.width - visRect.width,					     bounds.height - visRect.height));		} else {		    vp.setViewPosition(new Point(0, 					     bounds.height - visRect.height));		}	    }        }        private void scrollHome(JScrollPane scrollpane) {	    JViewport vp = scrollpane.getViewport();	    Component view;	    if (vp != null && (view = vp.getView()) != null) {		if (scrollpane.getComponentOrientation().isLeftToRight()) {		    vp.setViewPosition(new Point(0, 0));		} else {		    Rectangle visRect = vp.getViewRect();		    Rectangle bounds = view.getBounds();		    vp.setViewPosition(new Point(bounds.width - visRect.width, 0));		}            }        }	private void scroll(JScrollPane scrollpane, int orientation,                            int direction, boolean block) {	    JViewport vp = scrollpane.getViewport();	    Component view;	    if (vp != null && (view = vp.getView()) != null) {		Rectangle visRect = vp.getViewRect();		Dimension vSize = view.getSize();		int amount;		if (view instanceof Scrollable) {		    if (block) {			amount = ((Scrollable)view).getScrollableBlockIncrement			         (visRect, orientation, direction);		    }		    else {			amount = ((Scrollable)view).getScrollableUnitIncrement			         (visRect, orientation, direction);		    }		}		else {		    if (block) {			if (orientation == SwingConstants.VERTICAL) {			    amount = visRect.height;			}			else {			    amount = visRect.width;			}		    }		    else {			amount = 10;		    }		}		if (orientation == SwingConstants.VERTICAL) {		    visRect.y += (amount * direction);		    if ((visRect.y + visRect.height) > vSize.height) {			visRect.y = Math.max(0, vSize.height - visRect.height);		    }		    else if (visRect.y < 0) {			visRect.y = 0;		    }		}		else {		    if (scrollpane.getComponentOrientation().isLeftToRight()) {			visRect.x += (amount * direction);			if ((visRect.x + visRect.width) > vSize.width) {			    visRect.x = Math.max(0, vSize.width - visRect.width);			} else if (visRect.x < 0) {			    visRect.x = 0;			}		    } else {			visRect.x -= (amount * direction);                        if (visRect.width > vSize.width) {                            visRect.x = vSize.width - visRect.width;                        } else {                            visRect.x = Math.max(0, Math.min(vSize.width - visRect.width, visRect.x));			}		    }		}		vp.setViewPosition(visRect.getLocation());	    }	}    }    class Handler implements ChangeListener, PropertyChangeListener, MouseWheelListener {        //        // MouseWheelListener        //        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) {                    BasicScrollBarUI.scrollByUnits(toScroll, direction,                                                         e.getScrollAmount());                }                else if (e.getScrollType() ==                         MouseWheelEvent.WHEEL_BLOCK_SCROLL) {                    BasicScrollBarUI.scrollByBlock(toScroll, direction);                }            }        }        //        // ChangeListener: This is added to the vieport, and hsb/vsb models.        //	public void stateChanged(ChangeEvent e) {            JViewport viewport = scrollpane.getViewport();            if (viewport != null) {                if (e.getSource() == viewport) {                    viewportStateChanged(e);                }                else {                    JScrollBar hsb = scrollpane.getHorizontalScrollBar();                    if (hsb != null && e.getSource() == hsb.getModel()) {                        hsbStateChanged(viewport, e);                    }                    else {                        JScrollBar vsb = scrollpane.getVerticalScrollBar();                        if (vsb != null && e.getSource() == vsb.getModel()) {                            vsbStateChanged(viewport, e);                        }                    }                }            }        }        private void vsbStateChanged(JViewport viewport, ChangeEvent e) {            BoundedRangeModel model = (BoundedRangeModel)(e.getSource());            Point p = viewport.getViewPosition();            p.y = model.getValue();            viewport.setViewPosition(p);        }        private void hsbStateChanged(JViewport viewport, ChangeEvent e) {            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);        }        private void viewportStateChanged(ChangeEvent e) {            syncScrollPaneWithViewport();	}        //        // PropertyChangeListener: This is installed on both the JScrollPane        // and the horizontal/vertical scrollbars.        //        // Listens for changes in the model property and reinstalls the        // horizontal/vertical PropertyChangeListeners.        public void propertyChange(PropertyChangeEvent e) {            if (e.getSource() == scrollpane) {                scrollPanePropertyChange(e);            }            else {                sbPropertyChange(e);            }        }        private void scrollPanePropertyChange(PropertyChangeEvent e) {            String propertyName = e.getPropertyName();	    if (propertyName == "verticalScrollBarDisplayPolicy") {		updateScrollBarDisplayPolicy(e);	    }	    else if (propertyName == "horizontalScrollBarDisplayPolicy") {		updateScrollBarDisplayPolicy(e);	    }	    else if (propertyName == "viewport") {		updateViewport(e);	    }	    else if (propertyName == "rowHeader") {		updateRowHeader(e);	    }	    else if (propertyName == "columnHeader") {		updateColumnHeader(e);	    }	    else if (propertyName == "verticalScrollBar") {		updateVerticalScrollBar(e);	    }	    else if (propertyName == "horizontalScrollBar") {		updateHorizontalScrollBar(e);	    }	    else if (propertyName == "componentOrientation") {		scrollpane.revalidate();		scrollpane.repaint();	    }        }        // PropertyChangeListener for the horizontal and vertical scrollbars.        private void sbPropertyChange(PropertyChangeEvent e) {            String propertyName = e.getPropertyName();            Object source = e.getSource();            if ("model" == 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" == 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);                }            }        }    }}

⌨️ 快捷键说明

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