使用 Jython & Swing 实现图片上传按钮
Implementing an image upload button using Jython & Swing
我正在使用 Jython 和 Swing 开发一个跨平台桌面应用程序,我发现了一个问题。
我想开发一个按钮,允许我在其背景中加载图像并在我重新单击加载的图像时更改它。
作为示例,我附上了一些关于我希望我的小部件的图片。
Upload pane without image
然后,当我加载图像时:
Upload Pane with image
我尝试使用以下代码:
fd = FileDialog(self, "Scegli un'immagine", FileDialog.LOAD)
fd.setFile(';*.'.join(("*.bmp","jpg","jpeg","wbmp","png","gif")))
fd.setVisible(True)
fileName = fd.getFile()
if fileName != None :
fileAbsPath = os.path.abspath(fileName)
"""'self.bigDict['imgButton']' is the current JButton"""
self.bigDict['imgButton'].setIcon(ImageIcon(fileAbsPath))
当我点击 "Open" 时,图像没有插入到按钮中。我不明白为什么。
我还尝试了以下代码:
if fileName != None :
fileAbsPath = os.path.abspath(fileName)
img = ImageIO.read(getClass().getResource(fileAbsPath))
self.bigDict['imgButton'].setIcon(img)
上面的例子报如下错误:
img = ImageIO.read(getClass().getResource(fileAbsPath))
TypeError: getClass(): expected 1 args; got 0
我很想知道为什么按钮没有随着图像加载而更新,以及为什么 java 中的上述错误不会发生。
提前致谢!
getClass() 需要 1 个参数:隐式 this
参数。您必须在对象上调用该方法,或使用 MyClass.class 表示法。
问题很简单。
当使用 FileDialog 加载图像时,它在 FileDialog window 中为 "virtually located",但图像不存在。当我尝试使用 shutil.copy2(self.imgAbsPath, destinationPath+'/'+self.imgName)
将图像从绝对路径复制到目标文件夹时,我意识到了这一点,它报告了一条错误消息,表明该图像不存在。
要提供文件的具体路径,需要添加有关文件所在文件夹的信息。
实际上,在生成绝对路径之前,您必须创建 相对路径 :
fd = FileDialog(self, "Scegli un'immagine", FileDialog.LOAD)
fd.setFile(';*.'.join(("*.bmp","jpg","jpeg","wbmp","png","gif")))
fd.setVisible(True)
self.imgName = fd.getFile()
relativePath = fd.getDirectory() + fd.getFile() """Here is the missing piece!"""
if self.imgName != None:
self.imgAbsPath = os.path.abspath(relativePath) """Here the absolute path is correctly obtained!"""
self.bigDict['imgButton'].setIcon(ImageIcon(ImageIcon(self.imgAbsPath).getImage().getScaledInstance(130, 130, Image.SCALE_DEFAULT)))
"""The image, before being inserted into the button, is slightly resized, to avoid graphic bumps!"""
希望对您有所帮助。
我正在使用 Jython 和 Swing 开发一个跨平台桌面应用程序,我发现了一个问题。
我想开发一个按钮,允许我在其背景中加载图像并在我重新单击加载的图像时更改它。
作为示例,我附上了一些关于我希望我的小部件的图片。
Upload pane without image
然后,当我加载图像时:
Upload Pane with image
我尝试使用以下代码:
fd = FileDialog(self, "Scegli un'immagine", FileDialog.LOAD)
fd.setFile(';*.'.join(("*.bmp","jpg","jpeg","wbmp","png","gif")))
fd.setVisible(True)
fileName = fd.getFile()
if fileName != None :
fileAbsPath = os.path.abspath(fileName)
"""'self.bigDict['imgButton']' is the current JButton"""
self.bigDict['imgButton'].setIcon(ImageIcon(fileAbsPath))
当我点击 "Open" 时,图像没有插入到按钮中。我不明白为什么。
我还尝试了以下代码:
if fileName != None :
fileAbsPath = os.path.abspath(fileName)
img = ImageIO.read(getClass().getResource(fileAbsPath))
self.bigDict['imgButton'].setIcon(img)
上面的例子报如下错误:
img = ImageIO.read(getClass().getResource(fileAbsPath))
TypeError: getClass(): expected 1 args; got 0
我很想知道为什么按钮没有随着图像加载而更新,以及为什么 java 中的上述错误不会发生。
提前致谢!
getClass() 需要 1 个参数:隐式 this
参数。您必须在对象上调用该方法,或使用 MyClass.class 表示法。
问题很简单。
当使用 FileDialog 加载图像时,它在 FileDialog window 中为 "virtually located",但图像不存在。当我尝试使用 shutil.copy2(self.imgAbsPath, destinationPath+'/'+self.imgName)
将图像从绝对路径复制到目标文件夹时,我意识到了这一点,它报告了一条错误消息,表明该图像不存在。
要提供文件的具体路径,需要添加有关文件所在文件夹的信息。
实际上,在生成绝对路径之前,您必须创建 相对路径 :
fd = FileDialog(self, "Scegli un'immagine", FileDialog.LOAD)
fd.setFile(';*.'.join(("*.bmp","jpg","jpeg","wbmp","png","gif")))
fd.setVisible(True)
self.imgName = fd.getFile()
relativePath = fd.getDirectory() + fd.getFile() """Here is the missing piece!"""
if self.imgName != None:
self.imgAbsPath = os.path.abspath(relativePath) """Here the absolute path is correctly obtained!"""
self.bigDict['imgButton'].setIcon(ImageIcon(ImageIcon(self.imgAbsPath).getImage().getScaledInstance(130, 130, Image.SCALE_DEFAULT)))
"""The image, before being inserted into the button, is slightly resized, to avoid graphic bumps!"""
希望对您有所帮助。