📄 scrollpaneui.java
字号:
if (sbPropertyChangeListener == null) {
sbPropertyChangeListener = new ScrollBarPropertyChangeHandler();
}
return sbPropertyChangeListener;
}
protected ChangeListener createHSBChangeListener() {
return new HSBChangeListener();
}
/**
* Vertical scrollbar listener.
*/
public 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) {
ScrollBarUI.scrollTonicByUnits(toScroll, direction,
e.getScrollAmount());
}
else if (e.getScrollType() ==
MouseWheelEvent.WHEEL_BLOCK_SCROLL) {
ScrollBarUI.scrollTonicByBlock(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));
}
}
p.y = Math.max(p.y, 0);
newViewport.setViewPosition(p);
newViewport.addChangeListener(viewportChangeListener);
}
}
protected void updateRowHeader(PropertyChangeEvent e)
{
JViewport newRowHead = (JViewport)(e.getNewValue());
if (newRowHead != null) {
JViewport viewport = scrollpane.getViewport();
Point p = newRowHead.getViewPosition();
p.y = (viewport != null) ? viewport.getViewPosition().y : 0;
newRowHead.setViewPosition(p);
}
}
protected void updateColumnHeader(PropertyChangeEvent e)
{
JViewport newColHead = (JViewport)(e.getNewValue());
if (newColHead != null) {
JViewport viewport = scrollpane.getViewport();
Point p = newColHead.getViewPosition();
if (viewport == null) {
p.x = 0;
} else {
if (scrollpane.getComponentOrientation().isLeftToRight()) {
p.x = viewport.getViewPosition().x;
} else {
p.x = Math.max(0, viewport.getViewPosition().x);
}
}
newColHead.setViewPosition(p);
scrollpane.add(newColHead, COLUMN_HEADER);
}
}
private void updateHorizontalScrollBar(PropertyChangeEvent pce) {
updateScrollBar(pce, hsbChangeListener, hsbPropertyChangeListener);
}
private void updateVerticalScrollBar(PropertyChangeEvent pce) {
updateScrollBar(pce, vsbChangeListener, vsbPropertyChangeListener);
}
private void updateScrollBar(PropertyChangeEvent pce, ChangeListener cl,
PropertyChangeListener pcl) {
JScrollBar sb = (JScrollBar)pce.getOldValue();
if (sb != null) {
if (cl != null) {
sb.getModel().removeChangeListener(cl);
}
if (pcl != null) {
sb.removePropertyChangeListener(pcl);
}
}
sb = (JScrollBar)pce.getNewValue();
if (sb != null) {
if (cl != null) {
sb.getModel().addChangeListener(cl);
}
if (pcl != null) {
sb.addPropertyChangeListener(pcl);
}
}
}
public class PropertyChangeHandler implements PropertyChangeListener
{
public void propertyChange(PropertyChangeEvent e)
{
String propertyName = e.getPropertyName();
if (propertyName.equals("verticalScrollBarDisplayPolicy")) {
updateScrollBarDisplayPolicy(e);
}
else if (propertyName.equals("horizontalScrollBarDisplayPolicy")) {
updateScrollBarDisplayPolicy(e);
}
else if (propertyName.equals("viewport")) {
updateViewport(e);
}
else if (propertyName.equals("rowHeader")) {
updateRowHeader(e);
}
else if (propertyName.equals("columnHeader")) {
updateColumnHeader(e);
}
else if (propertyName.equals("verticalScrollBar")) {
updateVerticalScrollBar(e);
}
else if (propertyName.equals("horizontalScrollBar")) {
updateHorizontalScrollBar(e);
}
else if (propertyName.equals("componentOrientation")) {
scrollpane.revalidate();
scrollpane.repaint();
InputMap inputMap = getInputMap(JComponent.
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
SwingUtilities.replaceUIInputMap(scrollpane, JComponent.
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, inputMap);
UIManager.getLookAndFeelDefaults().put("ScrollPane.actionMap",
null);
ActionMap actionMap = getActionMap();
SwingUtilities.replaceUIActionMap(scrollpane, actionMap);
}
}
}
/**
* Creates an instance of PropertyChangeListener that's added to
* the JScrollPane by installUI(). Subclasses can override this method
* to return a custom PropertyChangeListener, e.g.
* <pre>
* class MyScrollPaneUI extends BasicScrollPaneUI {
* protected PropertyChangeListener <b>createPropertyChangeListener</b>() {
* return new MyPropertyChangeListener();
* }
* public class MyPropertyChangeListener extends PropertyChangeListener {
* public void propertyChange(PropertyChangeEvent e) {
* if (e.getPropertyName().equals("viewport")) {
* // do some extra work when the viewport changes
* }
* super.propertyChange(e);
* }
* }
* }
* </pre>
*
* @see java.beans.PropertyChangeListener
* @see #installUI
*/
protected PropertyChangeListener createPropertyChangeListener() {
return new PropertyChangeHandler();
}
/**
* Action to scroll left/right/up/down.
*/
private static class ScrollAction extends AbstractAction {
/** Direction to scroll. */
protected int orientation;
/** 1 indicates scroll down, -1 up. */
protected int direction;
/** True indicates a block scroll, otherwise a unit scroll. */
private boolean block;
protected ScrollAction(String name, int orientation, int direction,
boolean block) {
super(name);
this.orientation = orientation;
this.direction = direction;
this.block = block;
}
public void actionPerformed(ActionEvent e) {
JScrollPane scrollpane = (JScrollPane)e.getSource();
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());
}
}
}
/**
* Action to scroll to x,y location of 0,0.
*/
private static class ScrollHomeAction extends AbstractAction {
protected ScrollHomeAction(String name) {
super(name);
}
public void actionPerformed(ActionEvent e) {
JScrollPane scrollpane = (JScrollPane)e.getSource();
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));
}
}
}
}
/**
* Action to scroll to last visible location.
*/
private static class ScrollEndAction extends AbstractAction {
protected ScrollEndAction(String name) {
super(name);
}
public void actionPerformed(ActionEvent e) {
JScrollPane scrollpane = (JScrollPane)e.getSource();
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));
}
}
}
}
class UpperRightCorner extends JComponent
{
public void paint(Graphics g)
{
g.setColor(UIManager.getColor("Button.borderColor"));
g.drawLine(0, 0, 0, getHeight());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -