SWT的GC重复实例化出错,如何解决

dgqbcht 2008-12-18 01:10:31
SWT中GC使用出错
问题如下,

我在一个主窗口A(拥有一个自己的shell)下点击一个按钮,new一个窗口B(也拥有自己的shell)打开,B窗口内new了一个GC,默认让它去画一张图(Image的),然后随着用户在B窗口中进行操作,会读取并且重画不同的图像。但是当B窗口被第二次打开(关闭,或者直接在A窗口中再点击按钮new一个B窗口打开),都会出现错误让整个程序结束,不知道如何解决。错误代码如下

java.lang.IllegalArgumentException: Argument not valid
at org.eclipse.swt.SWT.error(SWT.java:3547)
at org.eclipse.swt.SWT.error(SWT.java:3481)
at org.eclipse.swt.SWT.error(SWT.java:3452)
at org.eclipse.swt.graphics.Image.internal_new_GC(Image.java:1963)
at org.eclipse.swt.graphics.GC.<init>(GC.java:153)
at org.eclipse.swt.graphics.GC.<init>(GC.java:119)
at gui.widgets.dialog.FixedNumberCombinationDialog.createContents(FixedNumberCombinationDialog.java:142)
at gui.widgets.dialog.FixedNumberCombinationDialog.open(FixedNumberCombinationDialog.java:62)

142行 gc = new GC(image);

其中的image使static并初始化过的。

...全文
126 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dgqbcht 2008-12-18
  • 打赏
  • 举报
回复
楼上正解,我本来是想把所有需要读的图片提前加载出来,然后谁用谁掉就行了,没想到SWT这点不够智能,每开一次就得初始化一堆呢。
现在解决的方法是,不提前加载任何东西,因为二次打开的时候如果前一次没有用完,哪个关闭都会导致错误,就各自读各自的吧。
qingkangxu 2008-12-18
  • 打赏
  • 举报
回复
参照了一下SWT的代码注视:
new GC(image);出现你的错误可能有以下两种可能
1- if the drawable is an image that is not a bitmap or an icon
就是说你的image不是一个位图或者图标的时候要出错(这不可能)
2- if the drawable is an image or printer that is already selected
into another graphics context
大体就是说你现在的image被别的GC用着的话,也是要出错的。

综合你说的
“其中的image使static并初始化过的。 ”
==========应该是第二个原因,

建议:
1,保证你的new GC(image); 的时候image不被别的GC使用,我想做到这一点的话就是你每次都应该是从新new一个image 而不应该把你的image 整成静态的
2,保证你说的两种情况(当B窗口被第二次打开(关闭,或者直接在A窗口中再点击按钮new一个B窗口打开)出现之前你的image应该被dispose掉。
####SWT有一点比较重要的,你自己new的资源(Color,font,Image等等),应该在使用之后dispose掉,这应该是一个好习惯。

62,615

社区成员

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

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