问题描述
用JNI封装了一个Win32dll(读取特定文件),swingGUI调用时,JNI方法返回结果都正常,但是调用该方法一次以后,GUI上未加载的界面(JFrame,JDialog,JPanel)打开后,上面的图片(如JButton,JLabel图标等)会部分丢失,在调用JNI方法前已经加载的界面上的图片则还在。java无任何错误输出,多次调用该方法后GUI内存也无明显增长。请问这可能是什么原因呢?
解决方案
解决方案二:
手动刷新一下行不调用一下刷新
解决方案三:
这个不应该是JNI造成的吧,调用方法之后swing是不是发生重绘了?到底什么情况,楼主说的再具体点
解决方案四:
调用该JNI方法前,图片之前显示过的,再调用都还在,没有显示过的,调用就不显示了感觉是调用JNI方法后资源无法加载进JVM了??比如说调用该JNI方法后,打开一个未开过的JDialog,上面某JButton上应有的图片不显示了。但是调试输出ImageIconico=(ImageIcon)Btn_xxx.getIcon();发现ico确实存在调试查看"ico"=ImageIcon(id=345)accessibleContext=nulldescription=".\img\new.gif"filename=".\img\new.gif"height=-1image=ToolkitImage(id=363)imageObserver=nullloadStatus=4location=nullwidth=-1用Btn_xxx.repaint();Btn_xxx.updateUI();还是一样,不显示该按钮图标。
解决方案五:
那你的JNI对界面有重绘操作?JNI都做什么了?调用完dll之后,有没有new什么东西放在界面上,把原来的按钮遮住了?感觉你这个还是重绘有点问题,有点怪异啊,呵呵。
解决方案六:
好像是有问题,下面是一个加载正常的imageIcon:"ico"=ImageIcon(id=429)accessibleContext=nulldescription=".\img\icon\refresh.gif"filename=".\img\icon\refresh.gif"height=24image=ToolkitImage(id=431)imageObserver=nullloadStatus=8location=nullwidth=24看了一下JDK,loadStatus=8是图像正常,loadStatus=4是图像加载错误/***Flagindicatingthatthedownloadingofmediaencountered*anerror.*@seejava.awt.MediaTracker#statusAll*@seejava.awt.MediaTracker#statusID*/publicstaticfinalintERRORED=4;/***Flagindicatingthatthedownloadingofmediawascompleted*successfully.*@seejava.awt.MediaTracker#statusAll*@seejava.awt.MediaTracker#statusID*/publicstaticfinalintCOMPLETE=8;
解决方案七:
JNI只是读取特定格式的文件,返回文件中存储的点信息,返回都正常。没有其他对界面的操作啊,调用后其他所有的界面上未加载的图标都加载失败了是好怪异,可能是封装的dll的问题吗
解决方案八:
又试了一下,把图片的相对路径设为绝对路径,图片居然显示了。StringrelativelyPath=System.getProperty("user.dir");Btn_xxx.setIcon(newImageIcon(relativelyPath+"\img\new.gif"));相对路径还是无法显示。Btn_AddPortGroup.setIcon(newImageIcon(".\img\new.gif"));是调用jni方法后,把".\"的相对路径更改了么?这个在java里哪里可以改?