Java 如何调整滚动窗格中滚动的位置
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2544758/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to adjust position of scroll in the scrollpane
提问by Sunil Kumar Sahoo
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
我已经创建了 JTextpane 并在 textpane 中插入了组件(像 Jtextarea 这样的组件)。当我在该 JTextpane 中插入新组件时,JTextpane 的( )Jscrollpane 的垂直滚动条会自动设置为底部。我想保持它设置在顶部位置。我怎样才能做到这一点
Thanks Sunil Kumar Sahoo
感谢 Sunil Kumar Sahoo
采纳答案by Adamski
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
.
这是我使用的实用程序类。它可用于滚动到 .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. <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);
}
}
回答by John
There are various methods that you can use, depending on what is inside the scrollpane. See the tutorial, the very last section.
您可以使用多种方法,具体取决于滚动窗格中的内容。请参阅教程,最后一节。
回答by trashgod
It should be possible to set the DefaultCaret
update policy to NEVER_UPDATE
. See the article Text Area Scrollingfor other uses.
应该可以将DefaultCaret
更新策略设置为NEVER_UPDATE
。请参阅文章文本区域滚动以了解其他用途。
回答by Hyman Russet
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()
.
我把它放在一个扩展 JScrollPane 的对象中,但你也可以在所有getVertivalScrollBar()
. setValue()
CENTER有两个s,因为getMaximum()
返回 的底部,而JScrollBar
不是它到达的最低值。这也适用于使用getHorizontalScrollBar()
代替 的水平滚动getverticalScrollBar()
。
回答by Jay Kumarr
jScrollPane.getVerticalScrollBar().setValue(1);
jScrollPane.getVerticalScrollBar().setValue(1);
回答by Jay Kumarr
ScrollPane's scroll value is always between ( 0.0 - 1 )
for example
滚动窗格的滚动值始终为(0.0 - 1)之间
,例如
0.0 = 0%
0.1 = 10%
0.2 = 20%
0.25 = 25%
.... so on
0.0 = 0%
0.1 = 10%
0.2 = 20%
0.25 = 25%
.... 以此类推
And you can adjust the scroll position using these values. For example, in JavaFX
您可以使用这些值调整滚动位置。例如,在 JavaFX 中
// 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...
apply logic as you need
根据需要应用逻辑