basicscrollpaneui.java
来自「linux下建立JAVA虚拟机的源码KAFFE」· Java 代码 · 共 683 行 · 第 1/2 页
JAVA
683 行
*/ class ViewportContainerListener implements ContainerListener { /** * Add the mouse wheel listener, allowing to scroll with the mouse. */ public void componentAdded(ContainerEvent e) { e.getChild().addMouseWheelListener(mouseWheelListener); } /** * Remove the mouse wheel listener. */ public void componentRemoved(ContainerEvent e) { e.getChild().removeMouseWheelListener(mouseWheelListener); } } /** * The number of pixels by that we should scroll the content that does * not implement Scrollable. */ static int SCROLL_NON_SCROLLABLES = 10; /** * The number of rows to scroll per mouse wheel click. From impression, * Sun seems using the value 3. */ static int ROWS_PER_WHEEL_CLICK = 3; /** The Scrollpane for which the UI is provided by this class. */ protected JScrollPane scrollpane; /** * The horizontal scrollbar listener. */ protected ChangeListener hsbChangeListener; /** * The vertical scrollbar listener. */ protected ChangeListener vsbChangeListener; /** * The viewport listener. */ protected ChangeListener viewportChangeListener; /** * The scrollpane property change listener. */ protected PropertyChangeListener spPropertyChangeListener; /** * The mousewheel listener for the scrollpane. */ MouseWheelListener mouseWheelListener; /** * The listener to add and remove the mouse wheel listener to/from * the component container. */ ContainerListener containerListener; public static ComponentUI createUI(final JComponent c) { return new BasicScrollPaneUI(); } protected void installDefaults(JScrollPane p) { scrollpane = p; LookAndFeel.installColorsAndFont(p, "ScrollPane.background", "ScrollPane.foreground", "ScrollPane.font"); LookAndFeel.installBorder(p, "ScrollPane.border"); p.setOpaque(true); } protected void uninstallDefaults(JScrollPane p) { p.setForeground(null); p.setBackground(null); p.setFont(null); p.setBorder(null); scrollpane = null; } public void installUI(final JComponent c) { super.installUI(c); installDefaults((JScrollPane) c); installListeners((JScrollPane) c); installKeyboardActions((JScrollPane) c); } /** * Installs the listeners on the scrollbars, the viewport and the scrollpane. * * @param sp the scrollpane on which to install the listeners */ protected void installListeners(JScrollPane sp) { if (spPropertyChangeListener == null) spPropertyChangeListener = createPropertyChangeListener(); sp.addPropertyChangeListener(spPropertyChangeListener); if (hsbChangeListener == null) hsbChangeListener = createHSBChangeListener(); sp.getHorizontalScrollBar().getModel().addChangeListener(hsbChangeListener); if (vsbChangeListener == null) vsbChangeListener = createVSBChangeListener(); sp.getVerticalScrollBar().getModel().addChangeListener(vsbChangeListener); if (viewportChangeListener == null) viewportChangeListener = createViewportChangeListener(); if (mouseWheelListener == null) mouseWheelListener = createMouseWheelListener(); if (containerListener == null) containerListener = new ViewportContainerListener(); JViewport v = sp.getViewport(); v.addChangeListener(viewportChangeListener); v.addContainerListener(containerListener); // Add mouse wheel listeners to the componets that are probably already // in the view port. for (int i = 0; i < v.getComponentCount(); i++) v.getComponent(i).addMouseWheelListener(mouseWheelListener); } /** * Installs additional keyboard actions on the scrollpane. This is a hook * method provided to subclasses in order to install their own keyboard * actions. * * @param sp the scrollpane to install keyboard actions on */ protected void installKeyboardActions(JScrollPane sp) { // TODO: Is this only a hook method or should we actually do something // here? If the latter, than figure out what and implement this. } /** * Creates and returns the change listener for the horizontal scrollbar. * * @return the change listener for the horizontal scrollbar */ protected ChangeListener createHSBChangeListener() { return new HSBChangeListener(); } /** * Creates and returns the change listener for the vertical scrollbar. * * @return the change listener for the vertical scrollbar */ protected ChangeListener createVSBChangeListener() { return new VSBChangeListener(); } /** * Creates and returns the change listener for the viewport. * * @return the change listener for the viewport */ protected ChangeListener createViewportChangeListener() { return new ViewportChangeHandler(); } /** * Creates and returns the property change listener for the scrollpane. * * @return the property change listener for the scrollpane */ protected PropertyChangeListener createPropertyChangeListener() { return new PropertyChangeHandler(); } /** * Creates and returns the mouse wheel listener for the scrollpane. * * @return the mouse wheel listener for the scrollpane */ protected MouseWheelListener createMouseWheelListener() { return new MouseWheelHandler(); } public void uninstallUI(final JComponent c) { super.uninstallUI(c); this.uninstallDefaults((JScrollPane)c); uninstallListeners((JScrollPane) c); installKeyboardActions((JScrollPane) c); } /** * Uninstalls all the listeners that have been installed in * {@link #installListeners(JScrollPane)}. * * @param c the scrollpane from which to uninstall the listeners */ protected void uninstallListeners(JComponent c) { JScrollPane sp = (JScrollPane) c; sp.removePropertyChangeListener(spPropertyChangeListener); sp.getHorizontalScrollBar().getModel() .removeChangeListener(hsbChangeListener); sp.getVerticalScrollBar().getModel() .removeChangeListener(vsbChangeListener); JViewport v = sp.getViewport(); v.removeChangeListener(viewportChangeListener); v.removeContainerListener(containerListener); for (int i = 0; i < v.getComponentCount(); i++) v.getComponent(i).removeMouseWheelListener(mouseWheelListener); } /** * Uninstalls all keyboard actions from the JScrollPane that have been * installed by {@link #installKeyboardActions}. This is a hook method * provided to subclasses to add their own keyboard actions. * * @param sp the scrollpane to uninstall keyboard actions from */ protected void uninstallKeyboardActions(JScrollPane sp) { // TODO: Is this only a hook method or should we actually do something // here? If the latter, than figure out what and implement this. } public Dimension getMinimumSize(JComponent c) { JScrollPane p = (JScrollPane ) c; ScrollPaneLayout sl = (ScrollPaneLayout) p.getLayout(); return sl.minimumLayoutSize(c); } public void paint(Graphics g, JComponent c) { // do nothing; the normal painting-of-children algorithm, along with // ScrollPaneLayout, does all the relevant work. } /** * Synchronizes the scrollbars with the viewport's extents. */ protected void syncScrollPaneWithViewport() { JViewport vp = scrollpane.getViewport(); // Update the horizontal scrollbar. JScrollBar hsb = scrollpane.getHorizontalScrollBar(); hsb.setMaximum(vp.getViewSize().width); hsb.setValue(vp.getViewPosition().x); hsb.setVisibleAmount(vp.getExtentSize().width); // Update the vertical scrollbar. JScrollBar vsb = scrollpane.getVerticalScrollBar(); vsb.setMaximum(vp.getViewSize().height); vsb.setValue(vp.getViewPosition().y); vsb.setVisibleAmount(vp.getExtentSize().height); } /** * Receives notification when the <code>columnHeader</code> property has * changed on the scrollpane. * * @param ev the property change event */ protected void updateColumnHeader(PropertyChangeEvent ev) { // TODO: Find out what should be done here. Or is this only a hook? } /** * Receives notification when the <code>rowHeader</code> property has changed * on the scrollpane. * * @param ev the property change event */ protected void updateRowHeader(PropertyChangeEvent ev) { // TODO: Find out what should be done here. Or is this only a hook? } /** * Receives notification when the <code>scrollBarDisplayPolicy</code> * property has changed on the scrollpane. * * @param ev the property change event */ protected void updateScrollBarDisplayPolicy(PropertyChangeEvent ev) { // TODO: Find out what should be done here. Or is this only a hook? } /** * Receives notification when the <code>viewport</code> property has changed * on the scrollpane. * * This method sets removes the viewportChangeListener from the old viewport * and adds it to the new viewport. * * @param ev the property change event */ protected void updateViewport(PropertyChangeEvent ev) { JViewport oldViewport = (JViewport) ev.getOldValue(); oldViewport.removeChangeListener(viewportChangeListener); JViewport newViewport = (JViewport) ev.getNewValue(); newViewport.addChangeListener(viewportChangeListener); syncScrollPaneWithViewport(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?