我有一个需要存储当前插入位置的应用程序,然后在滚动窗格上重新创建数据,然后将用户放回到他正在查看的位置。
int scrollIndex = 0;
if(scrollPane != null) {
scrollIndex = scrollPane.getVerticalScrollBar().getValue();
}
scrollPane = new JScrollPane(newpanel);
scrollPane.getVerticalScrollBar().setValue(scrollIndex);
这不会将插入符号设置为上一个滚动 - 但是在某些其他值上我不明白。
我也寻找过getCaret,但这似乎不存在。
编辑1
这几乎有效:
int scrollIndex = 0;
JViewport vp = null;
if(scrollPane != null) {
//scrollIndex = scrollPane.getVerticalScrollBar().getValue();
vp = scrollPane.getViewport();
}
scrollPane = new JScrollPane(newpanel);
//scrollPane.getVerticalScrollBar().setValue(scrollIndex);
scrollPane.setViewport(vp);
“视图”在我正在查看的scrollPoint上保持不变。但滚动条设置回0 - 即使视图很好。如果我像以前一样尝试setValue - 我再次得到错误的观点。
当我做scrollPane.setViewport(vp);我还有其他需要做的事情,滚动条会留在同一个地方吗?
答案 0 :(得分:0)
方法scrollPane.getVerticalScrollBar().getValue()
和scrollPane.getVerticalScrollBar().setValue(scrollIndex);
工作正常,请尝试使用单JScrollPane
。
我认为您在创建JScrollPane
。
而不是scrollPane = new JScrollPane(newpanel);
使用
scrollPane.getViewport().setView(newpanel);
可帮助您在视口中更改组件以进行滚动,而无需新实例。
观看下一个代码示例:
public class Example extends JFrame {
private JScrollPane pane;
private int value;
public Example() {
final JTextArea jTextArea = new JTextArea(10, 10);
final JTextArea jTextArea2 = new JTextArea(10, 10);
jTextArea2.setText("1\n21\n2\n\n\n\n\n121221\ne\n\nee\ne\n");
pane = new JScrollPane(jTextArea);
JButton save = new JButton("save");
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
value = pane.getVerticalScrollBar().getValue();
}
});
JButton load = new JButton("load");
load.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
pane.getViewport().setView(jTextArea2);
pane.getVerticalScrollBar().setValue(value);
}
});
getContentPane().add(save,BorderLayout.WEST);
getContentPane().add(pane,BorderLayout.CENTER);
getContentPane().add(load,BorderLayout.EAST);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Example().setVisible(true);
}
});
}
}