java图像未从列表重新绘制<path>
我试图从指定路径加载图像,文件列表存储在列表中<>;。 第一次初始化图像时,它会显示,但当我试图显示包含文件列表的列表实例中的下一个图像时,不会重新绘制图像。 问题是我第一次在构造函数中初始化映像时覆盖了 新的映像,现在在构造函数外部第一次初始化映像的位置我不知道
我的代码:
public void nextImage(int cnt)
{
System.out.println(cnt);
if (cnt < imageFiles.size())
{
System.out.println(imageFiles.size());
try
{
bg = ImageIO.read(new File((imageFiles.get(cnt)).toString()));
scaled = getScaledInstanceToFit(bg, new Dimension(600, 600));
setBackground(Color.BLACK);
}
catch(Exception e)
{
e.printStackTrace();
}
}
MouseHandler handler = new MouseHandler();
addMouseListener(handler);
addMouseMotionListener(handler);
System.out.println(cnt);
System.out.println(imageFiles.get(cnt).toString());
}
菜单项单击代码:
JMenuItem mntmRestoreImage = new JMenuItem("Next Image");
final ImagePane st = new ImagePane();
mntmRestoreImage.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent arg0)
{
st.nextImage(k);
k++;
}
});
mnEdit.add(mntmRestoreImage);
类别代码及;建造商:
private BufferedImage bg;
private BufferedImage scaled;
java.util.List<Path> imageFiles= getFilesFromDirectory(FileSystems.getDefault().getPath("D:\\New folder"));
public ImagePane()
{
try
{
bg = ImageIO.read(getClass().getResource("/images/src11.jpg"));
scaled = getScaledInstanceToFit(bg, new Dimension(600, 600));
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
counter also increments, now the code inside ImagePane() constructor overwrites the image of nextImage() function, so idea what happen out in this code ??
any suggestion ?
# 1 楼答案
这不是答案,但我无法将那么多代码粘贴到注释中
我会将您的代码更改为类似于这段代码的代码。这将图像加载与gui更新逻辑分离(如添加鼠标手柄等,我只粘贴了图像加载代码)
但这还没有优化
# 2 楼答案
我想我有一个完美的解决方案给你!我为你写了一个小程序,这样更容易理解
首先,我有一个方法让您检查文件是否为图片:
很简单!取下文件夹并迭代他的文件。获取文件的扩展名并检查它是否为有效的文件类型。在代码开头定义数组中的文件类型
最后,我将每个文件放入堆栈。请记住将堆栈填充到变量中,不要多次读取文件,因为您会遇到与以前相同的问题:
在那之后,为你的物品使用一个动作!在我的例子中我没有太多,你必须把你的方法放进去
在jmen中添加动作并设置帧的属性
最后用invokeLater方法执行你的程序
总结
基本上你需要一个东西来迭代,因为像integer这样的值并没有以你喜欢的方式保存。在我的示例中,我使用了一个堆栈,并在开始时保存其中的所有图片。重要的是,如果使用或完成了图片,则必须将其删除(使用stack.pop()作为堆栈)。我没有找到一种方法,可以检查文件是否为图片(如果是ImageIO捕获,则为坏文件)。我写了一个方法,如果你想你可以使用它