Java 如何在菜单项单击时从目录加载下一项?

Java 如何在菜单项单击时从目录加载下一项?,java,swing,file,actionlistener,jmenuitem,Java,Swing,File,Actionlistener,Jmenuitem,嗨,我正试图从所选目录中逐个提取项目,但问题是,当我单击“下一步”菜单项时,所有项目都从目录中汇集到一起。 我已将actionlistener放在菜单项单击中,并尝试在字符串变量中逐个存储项并在控制台上打印,但每次所有项都会加载我必须执行的操作 我的代码: final JFileChooser file; file = new JFileChooser(); file.showOpenDialog(contentPane); mnLoadDirectory.add(mntmSe

嗨,我正试图从所选目录中逐个提取项目,但问题是,当我单击“下一步”菜单项时,所有项目都从目录中汇集到一起。 我已将actionlistener放在菜单项单击中,并尝试在字符串变量中逐个存储项并在控制台上打印,但每次所有项都会加载我必须执行的操作

我的代码:

final JFileChooser file;
file = new JFileChooser();

file.showOpenDialog(contentPane);
        mnLoadDirectory.add(mntmSelectDir);
        File[] filesInDirectory = file.getCurrentDirectory().listFiles();
        String FileNames;
        //int i=1;

        JMenuItem mntmNextItem = new JMenuItem("Next Item");

        for (int i = 0; i < filesInDirectory.length; i++) 
        {
            if (filesInDirectory[i].isFile()) 
            {
                FileNames = filesInDirectory[i].getName();
                if (FileNames.endsWith(".jpg") || FileNames.endsWith(".JPG"))
                {
                    System.out.println(FileNames);
                }
            }
        }   



        mntmNextItem.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent arg0) 
            {           

            }
        });     
        mnLoadDirectory.add(mntmNextItem);      

        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
最终JFileChooser文件;
file=newjfilechooser();
showOpenDialog(contentPane);
mnLoadDirectory.add(mntmSelectDir);
File[]filesInDirectory=File.getCurrentDirectory().listFiles();
字符串文件名;
//int i=1;
JMenuItem mntmNextItem=新的JMenuItem(“下一项”);
for(int i=0;i
我没有把所有的代码都放进去,我只放了一个与这个相关的代码


有什么建议吗?

将文件内容读入
列表或数组中。维护某种指向当前元素的
int

准备移动到下一个元素时,增加
int
值,执行适当的边缘检查,并根据需要更新显示

用简单示例更新

这是一个基本的例子。它将指定目录扫描到
列表中
,并维护当前文件的
int
索引

当操作
next
菜单项时,它会简单地增加
int
索引值并更新显示

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class NextFile {

    public static void main(String[] args) {
        new NextFile();
    }

    private FilePane filePane;

    public NextFile() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                filePane = new FilePane();
                JMenuBar mb = new JMenuBar();
                JMenu fileMenu = new JMenu("File");
                mb.add(fileMenu);
                JMenuItem mntmNextItem = new JMenuItem("Next Item");
                fileMenu.add(mntmNextItem);

                mntmNextItem.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        filePane.nextFile();
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setJMenuBar(mb);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(filePane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FilePane extends JPanel {

        private JTextField path;
        private List<File> files;
        private int fileIndex = -1;

        public FilePane() {

            File parentPath = new File("/path/to/your/directory");
            File[] childFiles = parentPath.listFiles();
            files = new ArrayList<>(Arrays.asList(childFiles));

            setLayout(new GridBagLayout());
            path = new JTextField(20);
            add(path);

            nextFile();

        }

        public void nextFile() {
            if (files.size() > 0) {
                fileIndex++;
                if (fileIndex >= files.size()) {
                    fileIndex = 0;
                }
                path.setText(files.get(fileIndex).getPath());
                path.setCaretPosition(path.getText().length());
                path.moveCaretPosition(0);
            }
        }
    }
}
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.io.File;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入javax.swing.JFrame;
导入javax.swing.JMenu;
导入javax.swing.JMenuBar;
导入javax.swing.JMenuItem;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.SwingUtilities;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类NextFile{
公共静态void main(字符串[]args){
新的NextFile();
}
私有文件窗格文件窗格;
公共NextFile(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
filePane=newfilepane();
JMenuBar mb=新的JMenuBar();
JMenu fileMenu=新JMenu(“文件”);
添加(文件菜单);
JMenuItem mntmNextItem=新的JMenuItem(“下一项”);
fileMenu.add(mntmNextItem);
mntmNextItem.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
filePane.nextFile();
}
});
JFrame=新JFrame(“测试”);
frame.setJMenuBar(mb);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(文件窗格);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类文件窗格扩展了JPanel{
私有JTextField路径;
私人清单文件;
私有int fileIndex=-1;
公共文件窗格(){
File parentPath=新文件(“/path/to/your/directory”);
File[]childFiles=parentPath.listFiles();
files=newarraylist(Arrays.asList(childFiles));
setLayout(新的GridBagLayout());
路径=新的JTextField(20);
添加(路径);
nextFile();
}
public void nextFile(){
如果(files.size()>0){
fileIndex++;
如果(fileIndex>=files.size()){
fileIndex=0;
}
path.setText(files.get(fileIndex.getPath());
setCaretPosition(path.getText().length());
path.moveCaretPosition(0);
}
}
}
}

要从操作侦听器内部访问filesInDirectory,您需要将其声明为final

final File[] filesInDirectory = file.getCurrentDirectory().listFiles();
您所做的是迭代所有文件并打印出文件名,看起来您希望将for循环移动到动作侦听器中并添加一个中断。所以你会有类似的东西

    mntmNextItem.addActionListener(new ActionListener()
    {
        int i = 0;

        @Override
        public void actionPerformed(ActionEvent arg0) 
        {   
            if(i == filesInDirectory.length) {
                System.out.println("You are at the end");
            }        
            else {
                for (; i < filesInDirectory.length; i++) 
                {
                    if (filesInDirectory[i].isFile()) 
                    {
                        FileNames = filesInDirectory[i].getName();
                        if (FileNames.endsWith(".jpg") || FileNames.endsWith(".JPG"))
                        {
                            System.out.println(FileNames);
                            break;
                        }
                    }
                } 
            }
        }
    });
mntmNextItem.addActionListener(新ActionListener()
{
int i=0;
@凌驾
已执行的公共无效操作(操作事件arg0)
{   
if(i==filesInDirectory.length){
System.out.println(“您在末尾”);
}        
否则{
对于(;i