将文本追加到JTextPane时,JTextPane的滚动条不可见

时间:2019-06-11 10:38:57

标签: java swing

我在JScrollPane中有一个JTextPane(水平策略从不,垂直策略始终)。我已经编写了一种在此JTextPane中附加文本的方法。现在有一个按钮,单击该按钮,动作侦听器正在运行以进行一些数据操作并更新JTextPane上的数据。我正在使用JScrollPane.update()方法刷新附加的文本。文本正确更新,直到达到JTextPane的高度。添加更多文本时,它应显示垂直滚动条并更新文本。但是,这没有发生。相反,当流程从动作侦听器方法中流出时,整个文本就会出现。

我尝试过同时更新JTextPane和JScrollPane。但这似乎不起作用。

this.setState({ data }, () => console.log(this.state.data))

在循环运行时,应将JTextPane中的文本更新为
虚拟文字1
虚拟文字2
虚拟文字3
。 。

假设虚拟文本10之后,它达到了JScrollPane的高度。
现在预期的行为是-
它应该继续更新新文本,例如
虚拟文字11
虚拟文字12
..和垂直滚动条应出现。

但是实际行为是-
它可以正常工作,直到虚拟文本10(假设JScrollPane的高度可以容纳10行)。之后,JTextPane闪烁但没有任何反应,并且在循环完成时,它使用垂直滚动条一次显示了剩余的90行。

虚拟文字11
虚拟文字12



我想当我添加越来越多的行时,问题出在JScrollBar的可见性中。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

相反,当流程从动作侦听器方法中流出时,整个文本就会出现。

从侦听器调用的代码在Event Dispatch Thread (EDT)上执行。

因此,如上所述,您的循环代码正在EDT上执行。 EDT负责重新绘制GUI,但是直到主循环完成执行后,它才能这样做。

  

在伪文本10之前可以正常工作(假设JScrollPane的高度可以容纳10行)。之后,JTextPane闪烁但没有任何反应

它似乎仅能正​​常工作,因为您未正确使用Swing:

tp.update(tp.getGraphics());
this.sPane.update(this.sPane.getGraphics());

您不应直接调用update(...)方法。需要重绘组件时,Swing将在内部调用此方法。强制更新会导致闪烁。不要这样做!

要更新文本区域,您需要在单独的Thread上执行代码,以免阻塞EDT

一种执行此操作的方法是使用SwingWorker。它为您创建了线程,并允许您根据需要publish()将结果Concurrency添加到文本窗格,以便随后在EDT上正确更新文本窗格。

在注释部分获得的How to Use a SwingWorker链接在EDT上有一个部分,其中包含一些示例,可以帮助您入门。本教程还介绍了import { HttpClientModule, HttpClient } from '@angular/common/http'; @NgModule({ imports: [ HttpClientModule ] }) private url: string= './../../json/config.json'; constructor(private http: HttpClient) {} const aaa = this.http.get(this.url); console.log('aaa', aaa) console.log === Observable {_isScalar: false, source: Observable, operator: MapOperator} operator: MapOperator {project: ƒ, thisArg: undefined} source: Observable {_isScalar: false, source: Observable, operator: FilterOperator} _isScalar: false __proto__: Object 的工作原理。