⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basicscrollpaneui.java

📁 java jdk 1.4的源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * @(#)BasicScrollPaneUI.java	1.66 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package javax.swing.plaf.basic;import javax.swing.*;import javax.swing.event.*;import javax.swing.border.*;import javax.swing.plaf.*;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeEvent;import java.awt.Component;import java.awt.Container;import java.awt.LayoutManager;import java.awt.Rectangle;import java.awt.Dimension;import java.awt.Point;import java.awt.Insets;import java.awt.Graphics;import java.awt.event.*;import java.io.Serializable;import java.awt.Toolkit;/** * A default L&F implementation of ScrollPaneUI. * * @version 1.66 01/23/03 * @author Hans Muller */public class BasicScrollPaneUI    extends ScrollPaneUI implements ScrollPaneConstants{    protected JScrollPane scrollpane;    protected ChangeListener vsbChangeListener;    protected ChangeListener hsbChangeListener;    protected ChangeListener viewportChangeListener;    protected PropertyChangeListener spPropertyChangeListener;    private MouseWheelListener mouseScrollListener;    /**     * PropertyChangeListener installed on the vertical scrollbar.     */    private PropertyChangeListener vsbPropertyChangeListener;    /**     * PropertyChangeListener installed on the horizontal scrollbar.     */    private PropertyChangeListener hsbPropertyChangeListener;    /**     * The default implementation of createHSBPropertyChangeListener and     * createVSBPropertyChangeListener share the PropertyChangeListener, which     * is this ivar.     */    private PropertyChangeListener sbPropertyChangeListener;    /**     * State flag that shows whether setValue() was called from a user program     * before the value of "extent" was set in right-to-left component     * orientation.     */    private boolean setValueCalled = false;    public static ComponentUI createUI(JComponent x) {	return new BasicScrollPaneUI();    }    public void paint(Graphics g, JComponent c) {	Border vpBorder = scrollpane.getViewportBorder();	if (vpBorder != null) {	    Rectangle r = scrollpane.getViewportBorderBounds();	    vpBorder.paintBorder(scrollpane, g, r.x, r.y, r.width, r.height);	}    }    /**     * @return null which indicates that the LayoutManager will compute the value     * @see JComponent#getPreferredSize     */    public Dimension getPreferredSize(JComponent c) {	return null;    }    /**     * @return the preferred size     * @see #getPreferredSize     */    public Dimension getMinimumSize(JComponent c) {	return getPreferredSize(c);    }    /**     * @return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)     */    public Dimension getMaximumSize(JComponent c) {	return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE);    }    protected void installDefaults(JScrollPane scrollpane)     {	LookAndFeel.installBorder(scrollpane, "ScrollPane.border");	LookAndFeel.installColorsAndFont(scrollpane, 	    "ScrollPane.background", 	    "ScrollPane.foreground",             "ScrollPane.font");        Border vpBorder = scrollpane.getViewportBorder();        if ((vpBorder == null) ||( vpBorder instanceof UIResource)) {	    vpBorder = UIManager.getBorder("ScrollPane.viewportBorder");	    scrollpane.setViewportBorder(vpBorder);        }    }    protected void installListeners(JScrollPane c)     {	vsbChangeListener = createVSBChangeListener();        vsbPropertyChangeListener = createVSBPropertyChangeListener();	hsbChangeListener = createHSBChangeListener();        hsbPropertyChangeListener = createHSBPropertyChangeListener();	viewportChangeListener = createViewportChangeListener();	spPropertyChangeListener = createPropertyChangeListener();	JViewport viewport = scrollpane.getViewport();	JScrollBar vsb = scrollpane.getVerticalScrollBar();	JScrollBar hsb = scrollpane.getHorizontalScrollBar();	if (viewport != null) {	    viewport.addChangeListener(viewportChangeListener);	}	if (vsb != null) {	    vsb.getModel().addChangeListener(vsbChangeListener);            vsb.addPropertyChangeListener(vsbPropertyChangeListener);	}	if (hsb != null) {	    hsb.getModel().addChangeListener(hsbChangeListener);            hsb.addPropertyChangeListener(hsbPropertyChangeListener);	}	scrollpane.addPropertyChangeListener(spPropertyChangeListener);    mouseScrollListener = createMouseWheelListener();    scrollpane.addMouseWheelListener(mouseScrollListener);    }    protected void installKeyboardActions(JScrollPane c) {	InputMap inputMap = getInputMap(JComponent.				  WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);	SwingUtilities.replaceUIInputMap(c, JComponent.			       WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, inputMap);	ActionMap actionMap = getActionMap();	SwingUtilities.replaceUIActionMap(c, actionMap);    }    InputMap getInputMap(int condition) {	if (condition == JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) {	    InputMap keyMap = (InputMap)UIManager.get("ScrollPane.ancestorInputMap");	    InputMap rtlKeyMap;	    if (scrollpane.getComponentOrientation().isLeftToRight() ||		((rtlKeyMap = (InputMap)UIManager.get("ScrollPane.ancestorInputMap.RightToLeft")) == null)) {		return keyMap;	    } else {		rtlKeyMap.setParent(keyMap);		return rtlKeyMap;	    }	}	return null;    }    ActionMap getActionMap() {	ActionMap map = (ActionMap)UIManager.get("ScrollPane.actionMap");	if (map == null) {	    map = createActionMap();	    if (map != null) {		UIManager.getLookAndFeelDefaults().put("ScrollPane.actionMap",                                                       map);	    }	}	return map;    }    ActionMap createActionMap() {	ActionMap map = new ActionMapUIResource();	map.put("scrollUp", new ScrollAction("scrollUp", SwingConstants.						 VERTICAL, -1, true));	map.put("scrollDown", new ScrollAction("scrollDown",				     SwingConstants.VERTICAL, 1, true));	map.put("scrollHome", new ScrollHomeAction("ScrollHome"));	map.put("scrollEnd", new ScrollEndAction("ScrollEnd"));	map.put("unitScrollUp", new ScrollAction	       ("UnitScrollUp", SwingConstants.VERTICAL, -1,false));	map.put("unitScrollDown", new ScrollAction	       ("UnitScrollDown", SwingConstants.VERTICAL, 1, false));	if (scrollpane.getComponentOrientation().isLeftToRight()) {	    map.put("scrollLeft", new ScrollAction("scrollLeft",				  SwingConstants.HORIZONTAL, -1, true));	    map.put("scrollRight", new ScrollAction("ScrollRight",					SwingConstants.HORIZONTAL, 1, true));	    map.put("unitScrollRight", new ScrollAction	       ("UnitScrollRight", SwingConstants.HORIZONTAL, 1, false));	    map.put("unitScrollLeft", new ScrollAction	       ("UnitScrollLeft", SwingConstants.HORIZONTAL, -1, false));	} else {	    map.put("scrollLeft", new ScrollAction("scrollLeft",				  SwingConstants.HORIZONTAL, 1, true));	    map.put("scrollRight", new ScrollAction("ScrollRight",					SwingConstants.HORIZONTAL, -1, true));	    map.put("unitScrollRight", new ScrollAction	       ("UnitScrollRight", SwingConstants.HORIZONTAL, -1, false));	    map.put("unitScrollLeft", new ScrollAction	       ("UnitScrollLeft", SwingConstants.HORIZONTAL, 1, false));	}	return map;    }    public void installUI(JComponent x) {	scrollpane = (JScrollPane)x;	installDefaults(scrollpane);	installListeners(scrollpane);	installKeyboardActions(scrollpane);    }    protected void uninstallDefaults(JScrollPane c) {	LookAndFeel.uninstallBorder(scrollpane);        if (scrollpane.getViewportBorder() instanceof UIResource) {            scrollpane.setViewportBorder(null);        }    }    protected void uninstallListeners(JComponent c) {	JViewport viewport = scrollpane.getViewport();	JScrollBar vsb = scrollpane.getVerticalScrollBar();	JScrollBar hsb = scrollpane.getHorizontalScrollBar();	if (viewport != null) {	    viewport.removeChangeListener(viewportChangeListener);	}	if (vsb != null) {	    vsb.getModel().removeChangeListener(vsbChangeListener);            vsb.removePropertyChangeListener(vsbPropertyChangeListener);	}	if (hsb != null) {	    hsb.getModel().removeChangeListener(hsbChangeListener);            hsb.removePropertyChangeListener(hsbPropertyChangeListener);	}	scrollpane.removePropertyChangeListener(spPropertyChangeListener);    if (mouseScrollListener != null) {        scrollpane.removeMouseWheelListener(mouseScrollListener);    }	vsbChangeListener = null;	hsbChangeListener = null;	viewportChangeListener = null;	spPropertyChangeListener = null;        mouseScrollListener = null;    }    protected void uninstallKeyboardActions(JScrollPane c) {	SwingUtilities.replaceUIActionMap(c, null);	SwingUtilities.replaceUIInputMap(c, JComponent.			   WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);    }    public void uninstallUI(JComponent c) {	uninstallDefaults(scrollpane);	uninstallListeners(scrollpane);	uninstallKeyboardActions(scrollpane);	scrollpane = null;    }    protected void syncScrollPaneWithViewport()    {	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.     */    public class ViewportChangeHandler implements ChangeListener    {	public void stateChanged(ChangeEvent e) {	    syncScrollPaneWithViewport();	}    }    protected ChangeListener createViewportChangeListener() {	return new ViewportChangeHandler();    }    /**     * Horizontal scrollbar listener.     */    public 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();        }

⌨️ 快捷键说明

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