Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在滚动窗格中调整滚动的位置_Java_Swing - Fatal编程技术网

Java 如何在滚动窗格中调整滚动的位置

Java 如何在滚动窗格中调整滚动的位置,java,swing,Java,Swing,我已经创建了JTextpane并在textpane中插入了组件(像Jtextarea这样的组件)。当我在JTextpane中插入新组件时,JTextpane的Jscrollpane的(垂直滚动条)会自动设置为底部。我想把它保持在最高位置。我该怎么做 谢谢 Sunil Kumar Sahoo根据滚动窗格中的内容,您可以使用多种方法。请参见最后一节。这是我使用的实用程序类。它可用于滚动到JScrollPane的顶部、底部、左侧、右侧或水平/垂直中心 public final class Scroll

我已经创建了JTextpane并在textpane中插入了组件(像Jtextarea这样的组件)。当我在JTextpane中插入新组件时,JTextpane的Jscrollpane的(垂直滚动条)会自动设置为底部。我想把它保持在最高位置。我该怎么做

谢谢
Sunil Kumar Sahoo

根据滚动窗格中的内容,您可以使用多种方法。请参见最后一节。

这是我使用的实用程序类。它可用于滚动到
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. <tt>scroll(component, BOTTOM);</tt>.
     *
     * @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. <tt>scroll(component, LEFT, BOTTOM);</tt>.
     *
     * @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);
    }
}
public final类ScrollUtil{
公共静态最终int NONE=0,TOP=1,VCENTER=2,BOTTOM=4,LEFT=8,HCENTER=16,RIGHT=32;
私有静态最终int OFFSET=100;//hack需要(见下文)。
私有ScrollUtil(){
}
/**
*滚动到指定位置。例如,滚动(组件,底部);。
*
*@param c JComponent以滚动。
*要滚动到的@param部件位置。应为位或一个或多个值:
*无、顶部、VCENTER、底部、左侧、HCENTER、右侧。
*/
公共静态无效卷轴(JComponentC,int部分){
滚动(c,部分和(左| HCENTER |右),部分和(上| VCENTER |下));
}
/**
*滚动到指定位置。例如,滚动(组件、左侧、底部);。
*
*@param c JComponent以滚动。
*@param水平位置。应采用值:LEFT、HCENTER或RIGHT。
*@param垂直位置。应采用值:TOP、VCENTER或BOTTOM。
*/
公共静态无效卷轴(JComponentC,int水平,int垂直){
矩形可见=c.getVisibleRect();
矩形边界=c.getBounds();
开关(垂直){
外壳顶部:可见。y=0;断开;
case VCENTER:visible.y=(bounds.height-visible.height)/2;中断;
案例底部:可见。y=bounds.height-visible.height+偏移;中断;
}
开关(水平){
案例左侧:可见。x=0;中断;
case-HCENTER:visible.x=(bounds.width-visible.width)/2;break;
大小写右侧:可见.x=bounds.width-visible.width+OFFSET;中断;
}
//滚动到视口底部或右侧时,添加偏移值。
//这是因为如果没有此功能,某些组件(例如JTable)将
//不向右滚动到底部(可能是边界计算
//不考虑表头。如果
//偏移量是一个巨大的值(例如10000)——scrollRectToVisible方法
//仍然可以正常工作。
c、 scrollRectToVisible(可见);
}
}

应该可以将更新策略设置为
从不更新
。有关其他用途,请参阅文章。

我发现最简单的方法是:

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;
    }
}

我把它放在一个扩展了JScrollPane的对象中,但是您也可以在所有
getVertivalScrollBar()
之前添加JScrollPane的名称返回
JScrollBar
的底部,而不是它的最低值。这也适用于使用
getHorizontalScrollBar()
代替
getverticalScrollBar()
例如

0.0=0%
0.1=10%
0.2=20%
0.25=25%
……等等

您可以使用这些值调整滚动位置

// suppose this is the scrollpane
ScrollPane pane = new ScrollPane();

// to scroll the scrollpane horizontally 10% from its current position
pane.setHvalue(pane.getHvalue() + 0.1);

// to scroll 100%
pane.setHvalue(1);

and so on...
根据需要应用逻辑

这也适用于:

JTextArea. myTextArea;

// ...

myTextArea.select(0, 0);   // force the scroll value to the top

请添加一个简短的解释,说明为什么你的代码解决了这个问题,这样提问者就可以避免类似的问题,也许你的建议更适合他的代码。