2

我有以下代码片段

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 的文本动态设置为

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 而不是一些增加的值。

为什么这样 ??

4

2 回答 2

4

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

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

你可以试试

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

相反,看看是否打印出更新的值

或者,您可以AdjustmentListener在滚动条中添加一个,当发生更改时通知JScrollBar#addAdjustmentListener

于 2012-11-03T20:13:34.717 回答
1

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

采用

query_area = new JTextArea();
DefaultCaret caret = (DefaultCaret) query_area.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
于 2012-11-03T20:36:30.953 回答