java.swing.JScrollPane中改变内容时怎么能让垂直向的滚动条保持在上次用户拉到的位置?
现在当改变ViewportView中的控件内容时如果超过了JScrollPane的视图大小会显示滚动条,并且垂直向的滚动条会直接拉到最下面,如何设置使垂直向的滚动条保持在...
现在当改变ViewportView中的控件内容时如果超过了JScrollPane的视图大小会显示滚动条,并且垂直向的滚动条会直接拉到最下面,如何设置使垂直向的滚动条保持在上次用户拉到的位置?
比如我setViewportView(JEditorPane content); ,当我content.setText("一个很多内容的HTML");时会出垂直向的滚动条,并且该滚动条会拉到最下方,但是之前用户可能将滚动条拉到了中间,如何使滚动条依然保持在原位? 展开
比如我setViewportView(JEditorPane content); ,当我content.setText("一个很多内容的HTML");时会出垂直向的滚动条,并且该滚动条会拉到最下方,但是之前用户可能将滚动条拉到了中间,如何使滚动条依然保持在原位? 展开
2个回答
展开全部
你需要用JScrollBar来进行控制,可参考:
http://blog.csdn.net/nonetracer/article/details/6048929;
刚针对JTextArea,用上述方法测试了一下,发现没有效果。跟踪源码,发现方法本身是有效的。但是,JScrollBar主动设置value方法,会被BasicScrollPaneUI的syncScrollPaneWithViewport()方法中,所调用的JScrollBar的setValues()方法冲掉。
因此,JScrollBar的setValue()方法理论上能解决你的问题,但使用时还需要一些取巧或者其他处理
http://blog.csdn.net/nonetracer/article/details/6048929;
刚针对JTextArea,用上述方法测试了一下,发现没有效果。跟踪源码,发现方法本身是有效的。但是,JScrollBar主动设置value方法,会被BasicScrollPaneUI的syncScrollPaneWithViewport()方法中,所调用的JScrollBar的setValues()方法冲掉。
因此,JScrollBar的setValue()方法理论上能解决你的问题,但使用时还需要一些取巧或者其他处理
追问
是啊 现在就是不知道怎么把BasicScrollPaneUI的syncScrollPaneWithViewport()给关了
追答
方法是有的,syncScrollPaneWithViewport()方法是protected的,你可以自己写个ScrollPaneUI,然后覆写syncScrollPaneWithViewport()方法
展开全部
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;
}
}
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;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询