swing重绘JFrame的问题

WolfDriver 2014-11-17 04:09:04
我使用了一个MyFrame的类,继承了JFrame,重写了paint方法。然后使用Test类进行测试时,发现在MyFrame中添加JButton时,在程序运行后的初始状态并不显示组件,直到鼠标移动到JButton后,才将JButton显示出来

这是啥原因?该怎么解决??

程序运行后初始状态如下:


直到鼠标放置在按钮上时,状态如下:

...全文
349 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2014-11-18
  • 打赏
  • 举报
回复
super.paint();
WolfDriver 2014-11-17
  • 打赏
  • 举报
回复
引用 1 楼 humanity 的回复:
你为什么需要重写 paint ?一般来说重写类似 paintComponent 就好了。改写 paint 要做的事情会更多,因为对于 JFrame 这种 Window (窗体)类型的组件来说,它需要与操作系统打交道,告诉操作系统哪个面积下是自己管理的,鼠标点击这个面积之内的区域会由我来响应,在这个面积之外由操作系统通知其它的程序来响应,还有最大化和最小化之类的处理。比如,我们想做一个主程序是圆形的时候我们就需要考虑到这些(另外还需要给 jframe.setShape 来达到圆形的效果)。 一般来说当我们通过程序往容器型组件中添加组件时,可以考虑 invalidate, reinvaliate 和validate 这些方法调用之后 (具体调用哪个我也忘记别人怎么说的)再 repaint 就好了。它的原理就是,当程序调用 repaint 后它会检测是否真的有东西变了,然后就重新计算孩子组件的 layout 尺寸位置等然后重画,如果没有任何改变它就不做处理(比如你按一下向下的方向键就希望它移动却没有通过代码改变它的位置只是 repaint 它就不会真的动了,需要我们明确地告诉 Swing 它确实有东西变了,应该重画)
额...多谢了,不过如果不重写paint方法貌似没办法改变JFrame的形状好像
humanity 2014-11-17
  • 打赏
  • 举报
回复
你为什么需要重写 paint ?一般来说重写类似 paintComponent 就好了。改写 paint 要做的事情会更多,因为对于 JFrame 这种 Window (窗体)类型的组件来说,它需要与操作系统打交道,告诉操作系统哪个面积下是自己管理的,鼠标点击这个面积之内的区域会由我来响应,在这个面积之外由操作系统通知其它的程序来响应,还有最大化和最小化之类的处理。比如,我们想做一个主程序是圆形的时候我们就需要考虑到这些(另外还需要给 jframe.setShape 来达到圆形的效果)。 一般来说当我们通过程序往容器型组件中添加组件时,可以考虑 invalidate, reinvaliate 和validate 这些方法调用之后 (具体调用哪个我也忘记别人怎么说的)再 repaint 就好了。它的原理就是,当程序调用 repaint 后它会检测是否真的有东西变了,然后就重新计算孩子组件的 layout 尺寸位置等然后重画,如果没有任何改变它就不做处理(比如你按一下向下的方向键就希望它移动却没有通过代码改变它的位置只是 repaint 它就不会真的动了,需要我们明确地告诉 Swing 它确实有东西变了,应该重画)

62,621

社区成员

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

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