swing JScrollPane实现即时滚动,不等主线程返回实例

xiaoduan95 2014-11-13 10:34:54
JScrollPane是否可以实现即时滚动, 不等主线程返回。 就像JTextArea可以使用paintImmediately方法实现即时添加一样

上图说明需求。


如图所示,点击启动按钮时会在监控屏打印信息,但由于点击启动以后有死循环存在,这个死循环是必须要的。所以为了实现即时添加信息,使用了JTextArea.paintImmediately方法,但是滚动条不会即时滚动,由于有死循环,所以也等不到主线程返回。那么请问怎样可以不等主线程返回就能达到滚动效果呢?
目前代码如下:



求大神支招。
...全文
139 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2014-11-13
  • 打赏
  • 举报
回复
哦,另外,Swing 一般重画有 repaint 方法,但可能需要你明确地先调用 invalidate(), reinvalidate() 之类的方法,我忘记了是要怎么调用,但具体的原理是: 1、当 Swing 准备重画界面时,如果它觉得好像没有什么东西变了,它就什么也不做,比如你根据一个变量值来画图,而这个变量值与界面的任何状态(比如值,尺寸)之类的没有任何关系,那么 Swing 没有得到任何 Property Changed Event 事件发送来的通知,它就认为你什么也没有改,因此跳过重画图的操作。 2、要让 Swing 觉得你真的改了点什么,你得 invalidate (也可能是 reinvalidate,具体我不了解细节),然后再来 repaint。 你当前死循环没有看到界面滚动可能是你没有调用 repaint 或其它类似用途的方法,paitImmediately 不知道啥用途。
humanity 2014-11-13
  • 打赏
  • 举报
回复
我也不明白怎么是这样的, 正常的流程是你改了组件的状态值,Swing 会在 Event Dispatcher Thread 中派发事件 (事件派发线程),换句话说只你的线程不在 Event Dispatcher Thread 中就应该不会阻挡 Swing 画图。 所以你更新 JTextArea 的 action listener 不能运行在 Swing 的 Event Dispatcher Thread 中。 SwingUtilities.isEventDispatcherThread() 能告诉你当前线程是否是 Swing 的事件派发线程。
xiaoduan95 2014-11-13
  • 打赏
  • 举报
回复
引用 1 楼 xiaomm627 的回复:
这个用多线程不行吗。点击启动,开启一个线程控制滚动条。 还是我没看明白?
本来我这个就是个多线程的程序。
xiaomm627 2014-11-13
  • 打赏
  • 举报
回复
这个用多线程不行吗。点击启动,开启一个线程控制滚动条。 还是我没看明白?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧