关于repaint,paint,paintComponent...的问题

http://topic.csdn.net/t/20050419/17/3949654.html#

A:小弟想把控件设为setEnable(false);开始没问题,可后来在方法中加了一条读Socket的阻塞语句  
  ReadLine(),问题就来了,界面上每个按钮在阻塞时都没变化,必须要等到方法返回才变为disabled,  
  如果要它马上变化,试着用repaint(),不行,只能用paintComponent(getGraphics())  
        问题:1   java里面是否在设置控件属性过后并不马上在屏幕上反映出来呢?如果是,那什么时候系统  
  会自动重绘或修改控件状态呢,除了最大化最小化等等以外,每个方法返回时也会吗?  
                  2   repaint,paint,update,paintComponent等方法到底是怎么调来调去的呀??帮助说一般不要  
  直接调用paint之类,只需repaint就行了,但是经常直接调能工作,repaint就不行.java里面让我感觉  
  有点迷惑,不象vc里只需用消息通知系统重绘就行了,而自己只需重写OnPaint.   java里应该怎么用他们  
  呢?  
        小弟初学,还请各位讲详细一些,越详细越好,先谢过了

---------------------------------------------------------------------------------------------------------------

B:其实java里设置属性后会导致重绘的,只不过由于这个重绘事件也被放在事件派发线程里的,因此就导致了事件派发线程被Idle了,要避免这种情况,将这个堵塞动作放到另外的线程里面完成。  
          repaint是出发重绘动作,当调用repaint后,会通知repaintManager增加一个重绘区域,repaintManager在一定条件下会合并一些重绘区域,然后派发一个绘制动作到事件派发线程(EventQueue)。  
          事件派发线程执行到这个绘制事件时,就会调用组件的paint,在paint方法里会先调用update来将重绘区域清空(默认情况下是填充白色),然后再调用paintComponent来绘制自身,最后调用paintChildren来绘制所有的子。具体流程可以参考JComponent里的paint方法。

------------------------------------------------------------

A: 1     既然设置属性之后重绘事件是被放在派发线程里,那么应该说本线程的阻塞并不会造成派发线程  
  的阻塞呀,那为什么会设置的视觉结果要等到方法返回时再改变呢?关键是我用paintComponent(getGraphics())就能够立刻得到结果,如果是派发线程重绘事件的问题,那这时能成功又是什么原因呢  
        2     至于repaint不行而paintComponent就行的问题,照楼上的回答的思路,小弟想是否是因为  
  repaint时派发线程还没有执行到这个事件,因而不能立刻绘出结果?但如果是这样,因该在等待一会之后就能够有结果呀,但事实为什么不是呢?  
        3     如果repaint不能立刻得到所想的结果,为什么文档中推荐用户调用的是它而不是直接使用其他  
  几个方法呢,还是我在使用时存在误区?  
        还望赐教!!!   

-----------------------------------------------------
  B:1、难道你的阻塞不是由Button触发的吗?Button按下的动作就是在事件派发线程里的。  
  2、paintComponent时是直接绘制,是在Socket触发IDle之前,只要这个方法能被执行到,那么就能重新绘制Button  
  3、repaint是产生一个重绘事件到事件派发线程里去了,所以才不行,paintComponent没有产生事件而是直接绘制。记住绘制和触发重绘是两个过程。  
  4、是你使用时的错误,不应该在button的Action事件中处理会导致线程阻塞的动作。之所以推荐repaint,是因为系统会合并绘制,同时repaint还能避免组件相互覆盖时的绘制错误。

-------------------------------------------------------------------------

A:哦,我好象有点明白了,是不是重绘操作和Button按下的操作先后都排在了事件派发线程中,Button  
  的阻塞导致了重绘操作的不能执行?

-----------------------------------------------------------------------

  B:是的,就是这个道理,所以需要把Socket的操作放到独立线程里去。

---------------------------------------------------------------------

A:哦,谢谢啦  
          也就是说事件的处理应尽量能立刻返回,耗时和会引起阻塞的过程都应放到后台线程中去对吧?  
          最后还有个相关的问题,为什么现在推荐覆盖paintComponent而不推荐覆盖paint呢?

---------------------------------------------------------------------------

  B:因为你要为其他绘制操作保留调用过程,如果覆盖paint,那么就完全由你来完成paint了,update和paintChildren就无法进行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值