How to adjust position of scroll in the scrollpane

匿名 (未验证) 提交于 2019-12-03 01:17:01

问题:

I have created JTextpane and inserted components inside textpane (components like Jtextarea). (vertical scrollbar of )Jscrollpane of JTextpane is automatically set to bottom when I insert new components in that JTextpane. I want to keep it to be set to the top position. How can I do this

Thanks Sunil Kumar Sahoo

回答1:

Here's a utility class I use. It can be used to scroll to the top, bottom, left, right or horizonatal / vertical center of a JScrollPane.

public final class ScrollUtil {     public static final int NONE = 0, TOP = 1, VCENTER = 2, BOTTOM = 4, LEFT = 8, HCENTER = 16, RIGHT = 32;     private static final int OFFSET = 100; // Required for hack (see below).      private ScrollUtil() {     }      /**      * Scroll to specified location.  e.g. scroll(component, BOTTOM);.      *      * @param c JComponent to scroll.      * @param part Location to scroll to.  Should be a bit-wise OR of one or moe of the values:      * NONE, TOP, VCENTER, BOTTOM, LEFT, HCENTER, RIGHT.      */     public static void scroll(JComponent c, int part) {         scroll(c, part & (LEFT|HCENTER|RIGHT), part & (TOP|VCENTER|BOTTOM));     }      /**      * Scroll to specified location.  e.g. scroll(component, LEFT, BOTTOM);.      *      * @param c JComponent to scroll.      * @param horizontal Horizontal location.  Should take the value: LEFT, HCENTER or RIGHT.      * @param vertical Vertical location.  Should take the value: TOP, VCENTER or BOTTOM.      */     public static void scroll(JComponent c, int horizontal, int vertical) {         Rectangle visible = c.getVisibleRect();         Rectangle bounds = c.getBounds();          switch (vertical) {             case TOP:     visible.y = 0; break;             case VCENTER: visible.y = (bounds.height - visible.height) / 2; break;             case BOTTOM:  visible.y = bounds.height - visible.height + OFFSET; break;         }          switch (horizontal) {             case LEFT:    visible.x = 0; break;             case HCENTER: visible.x = (bounds.width - visible.width) / 2; break;             case RIGHT:   visible.x = bounds.width - visible.width + OFFSET; break;         }          // When scrolling to bottom or right of viewport, add an OFFSET value.         // This is because without this certain components (e.g. JTable) would         // not scroll right to the bottom (presumably the bounds calculation         // doesn't take the table header into account.  It doesn't matter if         // OFFSET is a huge value (e.g. 10000) - the scrollRectToVisible method         // still works correctly.          c.scrollRectToVisible(visible);     } } 


回答2:

I have found that the easiest way to do this is the following:

public void scroll(int vertical) {             switch (vertical) {         case SwingConstants.TOP:             getVerticalScrollBar().setValue(0);             break;         case SwingConstants.CENTER:             getVerticalScrollBar().setValue(getVerticalScrollBar().getMaximum());             getVerticalScrollBar().setValue(getVerticalScrollBar().getValue() / 2);             break;         case SwingConstants.BOTTOM:               getVerticalScrollBar().setValue(getVerticalScrollBar().getMaximum());             break;     } } 

I placed this in an object which extended JScrollPane but you could also add the name of your JScrollPane before all the getVertivalScrollBar(). There is two setValue()s for CENTER because getMaximum() returns the bottom of the JScrollBar, not the lowest value it goes to. This also works for Horizontal Scrolling using getHorizontalScrollBar() in place of getverticalScrollBar().



回答3:

It should be possible to set the DefaultCaret update policy to NEVER_UPDATE. See the article Text Area Scrolling for other uses.



回答4:

There are various methods that you can use, depending on what is inside the scrollpane. See the tutorial, the very last section.



回答5:

jScrollPane.getVerticalScrollBar().setValue(1);



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!