我正在尝试从指定路径加载图像,文件列表存储在List<>中。 在第一次初始化图像时它会显示但是当我试图从列出包含文件列表的实例显示下一个图像时,不会重新绘制图像。 什么是错的是我第一次在构造函数中初始化图像覆盖 新图片,现在 首次在构造函数外部初始化图像 我不知道。
我的代码:
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);
班级代码&amp;构造函数:
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();
}
}
计数器也递增,现在是ImagePane()构造函数内的代码 覆盖nextImage()函数的图像,所以想出了什么 在此代码中
任何建议?
答案 0 :(得分:2)
我想我有完美的解决方案!我为你写了一个小程序,所以更容易理解。
首先,我有一种方法可以检查文件是否是图片:
public Stack<File> getFilesInFolder(String startPath) {
File startFolder = new File(startPath);
Stack<File> picturestack = new Stack<File>();
String extension;
int dotindex;
// Go through the folder
for (File file : startFolder.listFiles()) {
extension = "";
dotindex = file.getName().lastIndexOf('.'); // Get the index of the dot in the filename
if (dotindex > 0) {
extension = file.getName().substring(dotindex + 1);
// Iterate all valid file types and check it
for (String filetype : validpicturetypes) {
if (extension.equals(filetype)) {
picturestack.add(file);
}
}
}
}
return picturestack;
}
很简单!拿起文件夹并迭代他的文件。获取文件的扩展名并检查它是否是有效的文件类型。在代码开头定义数组中的文件类型。
String[] validpicturetypes = {"png", "jpg", "jpeg", "gif"};
最后,我将每个文件推入堆栈。记得把堆栈填充到一个变量中,不要多次读取文件,因为你得到的问题和以前一样:
Stack<File> pictures = getFilesInFolder("C:\\Users\\Admin\\Desktop");
之后使用针对您的JMenuItem的Action!在我的例子中,我没有太多,你必须把你的方法放进去!
Action nextpictureaction = new AbstractAction("Next Picture") {
private static final long serialVersionUID = 2421742449531785343L;
@Override
public void actionPerformed(ActionEvent e) {
if (!pictures.isEmpty()) {
System.out.println(pictures.pop().getName());
}
}
};
在JMenu中添加Action并设置Frame的属性。
/*
* Add Components to Frame
*/
setJMenuBar(menubar);
menubar.add(toolsmenu);
toolsmenu.add(nextpictureaction);
/*
* Frame Properties
*/
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationByPlatform(true);
setSize(1000, 700);
setTitle("PictureEditor");
setVisible(true);
最后使用invokeLater方法执行程序!
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new PictureEditor();
}
});
}
基本上你需要一个迭代的东西,因为像整数这样的值不会按你喜欢的方式保存。在我的例子中,我使用了一个堆栈并在其中保存所有图片。重要的是,如果您使用或完成了图片,则必须将其删除(对堆栈使用stack.pop())。我没有找到一种方法来检查文件是否是图片(如果它是ImageIO捕获它是坏的)。如果你想要你可以使用它,我写了一个方法。
答案 1 :(得分:1)
这不是答案,但我无法将这么多代码粘贴到评论中。
我会将您的代码更改为这段代码。这将分离gui更新逻辑中的图像加载(如添加鼠标操作程序等,我只粘贴图像加载代码)。
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Arrays;
import java.util.Iterator;
import javax.imageio.ImageIO;
public class ImageLoader
{
public static class ImageContainer
{
BufferedImage bg = null;
BufferedImage scaled;
}
Iterator<File> imageFiles = Arrays.asList(
new File("D:\\New folder").listFiles()).iterator();
public ImageContainer nextImage(Dimension dimensionToFit) throws Exception
{
ImageContainer c = new ImageContainer();
if (imageFiles.hasNext())
{
File file = imageFiles.next();
//you might not need this, if only images are in this directory
if(file.isDirectory())
return null;
c.bg = ImageIO.read(file);
c.scaled = getScaledInstanceToFit(c.bg, dimensionToFit);
return c;
}
else
return null;
}
private BufferedImage getScaledInstanceToFit(BufferedImage bg,
Dimension dimensionToFit)
{
//do the risizing
}
}
虽然尚未优化。