有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

嗨,我正试图从所选目录中逐个提取项目,但问题是,当我单击“下一步”菜单项时,所有项目都从目录中汇集到一起。 我已将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);

我没有把所有的代码都放进去,我只放了一个与这个相关的代码

有什么建议吗


共 (2) 个答案

  1. # 1 楼答案

    将文件内容读入List或数组。维护某种指向当前元素的int值,如图所示

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

    用简单示例更新

    这是一个基本的例子。它将指定目录扫描到List中,并维护当前文件的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);
                }
            }
        }
    }
    
  2. # 2 楼答案

    要从操作侦听器内部访问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;
                            }
                        }
                    } 
                }
            }
        });