您好我正在尝试从所选目录中逐个获取项目,但问题是,当我点击下一个菜单项时,所有来自目录。 我已经在menuitem上点击了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);
我没有放入所有代码,我只是放了一个与此相关的代码。
任何建议???
答案 0 :(得分: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);
}
}
}
}
答案 1 :(得分:1)
要从动作侦听器内部访问filesInDirectory,您需要将其声明为最终
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;
}
}
}
}
}
});