JScrollPane设置滚动位置

时间:2012-11-03 20:08:19

标签: java swing jscrollpane jscrollbar adjustment

我有以下代码段

query_area = new JTextArea("");
query_scroll_pane = new JScrollPane(query_area);
query_scroll_pane.setSize(1000,80);
query_scroll_pane.setLocation(10,10);
query_panel.add(query_scroll_pane);

将我的textarea添加到scrollpane。现在在方法中我动态地将textarea的文本设置为

sf.query_area.setText("Query "+(sf.query_counter)+sf.query_store[sf.query_counter]);
System.out.println("Position: "+sf.query_scroll_pane.getHorizontalScrollBar().getValue());

现在我的查询是当显示更长的文本时,会出现滚动条,但system.out.println会将滚动条的位置打印为0而不是某些增加的值。

为什么这样?

2 个答案:

答案 0 :(得分:4)

我能想到的唯一原因是因为视口位置没有改变。

首先想到的是,视口可能尚未对文本开始集中的位置变化作出反应,因此在设置文本后立即转储结果反映了当前状态滚动条(尚未开始更新)

你可以尝试

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        System.out.println("Position: "+sf.query_scroll_pane.getHorizontalScrollBar().getValue());        
    }
});

而是查看是否打印出更新的值

另外,您可以在滚动条中添加AdjustmentListener,这会在发生更改时通知JScrollBar#addAdjustmentListener

答案 1 :(得分:1)

  

现在我的查询是当显示更长的文本时,会出现滚动条   system.out.println将滚动条的位置打印为0而不是一些   价值增加。

使用

query_area = new JTextArea();
DefaultCaret caret = (DefaultCaret) query_area.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);