java.swing.JScrollPane中改变内容时怎么能让垂直向的滚动条保持在上次用户拉到的位置?

现在当改变ViewportView中的控件内容时如果超过了JScrollPane的视图大小会显示滚动条,并且垂直向的滚动条会直接拉到最下面,如何设置使垂直向的滚动条保持在... 现在当改变ViewportView中的控件内容时如果超过了JScrollPane的视图大小会显示滚动条,并且垂直向的滚动条会直接拉到最下面,如何设置使垂直向的滚动条保持在上次用户拉到的位置?
比如我setViewportView(JEditorPane content); ,当我content.setText("一个很多内容的HTML");时会出垂直向的滚动条,并且该滚动条会拉到最下方,但是之前用户可能将滚动条拉到了中间,如何使滚动条依然保持在原位?
展开
 我来答
lecroy03
2013-07-26 · TA获得超过313个赞
知道小有建树答主
回答量:240
采纳率:100%
帮助的人:146万
展开全部
你需要用JScrollBar来进行控制,可参考:
http://blog.csdn.net/nonetracer/article/details/6048929

刚针对JTextArea,用上述方法测试了一下,发现没有效果。跟踪源码,发现方法本身是有效的。但是,JScrollBar主动设置value方法,会被BasicScrollPaneUI的syncScrollPaneWithViewport()方法中,所调用的JScrollBar的setValues()方法冲掉。
因此,JScrollBar的setValue()方法理论上能解决你的问题,但使用时还需要一些取巧或者其他处理
追问
是啊 现在就是不知道怎么把BasicScrollPaneUI的syncScrollPaneWithViewport()给关了
追答
方法是有的,syncScrollPaneWithViewport()方法是protected的,你可以自己写个ScrollPaneUI,然后覆写syncScrollPaneWithViewport()方法
快了更高的cK
2013-07-26 · 超过14用户采纳过TA的回答
知道答主
回答量:24
采纳率:0%
帮助的人:35.3万
展开全部
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;

public class JScrollPaneDemo {

private static int originalValue = 100;

public static void main(String[] args) {

JFrame demo = new JFrame();
final JScrollPane jsp = new JScrollPane();
final JScrollBar vBar = jsp.getVerticalScrollBar();
JEditorPane content = new JEditorPane();
content.setText("1\n\r\n\r\n\r\n\r1\n\r\n\r\n\r\n\r1\n\r\n\r\n\r\n\r1\n\r\n\r\n\r\n\r1\n\r\n\r\n\r\n\r1\n\r\n\r\n\r\n\r");
jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jsp.setViewportView(content);
/**
* 为滚动条添加值事件
*/
vBar.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
vBar.setValue(getOriginalValue());
if(getOriginalValue()!=e.getValue()){
setOriginalValue(e.getValue());
}
}

});

demo.add(jsp);
demo.setSize(320, 240);
demo.setDefaultCloseOperation(3);
demo.setVisible(true);

}

private static void setOriginalValue(int value) {
originalValue = value;
}

private static int getOriginalValue() {
return originalValue;
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式