JList实现文件浏览功能

本文档详细介绍了如何利用Java Swing库中的JList组件来创建一个文件浏览的功能。通过JList,可以方便地展示文件系统中的目录和文件,为用户提供友好的图形用户界面。

源码如下:

package t;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.filechooser.FileSystemView;

final class FileListDemo {
	private static final FileSystemView fsv = FileSystemView.getFileSystemView();

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 窗口创建
		JFrame f = new JFrame("文件列表浏览器");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(300, 500);
		// 居中
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		int x = (screenSize.width - f.getWidth()) / 2;
		int y = (screenSize.height - f.getHeight()) / 2;
		f.setLocation(x, y);

		// 容器
		Container root = f.getContentPane();
		FileList fileList = new FileList();
		root.setLayout(new BorderLayout(2, 2));
		// 顶部
		{
			Box top = Box.createHorizontalBox();
			// 容器
			top.setOpaque(false);
			top.setPreferredSize(new Dimension(top.getWidth(), 30));

			// 控件
			JButton returnButton = new JButton("←");
			returnButton.setToolTipText("返回");
			returnButton.setPreferredSize(new Dimension(45, top.getHeight()));
			returnButton.addActionListener((e) -> {
				fileList.returnDir();
			});
			JTextField filePath = new JTextField();
			fileList.setFileOpenListener((e) -> {
				if (e != null)
					filePath.setText(e.getAbsolutePath());
			});
			filePath.addActionListener((e) -> {
				File file = new File(filePath.getText());
				if (file.exists())
					fileList.openItem(new FileItem(fsv.getSystemDisplayName(file), fsv.getSystemIcon(file), file));
				else
					filePath.setText("");
			});

			// 添加
			top.add(returnButton);
			top.add(filePath);
			root.add(top, BorderLayout.PAGE_START);
		}
		// 中间
		root.add(new JScrollPane(fileList));

		f.setVisible(true);
	}

	// 文件打开监听器
	private static interface FileOpenListener {
		void fileOpenEvent(File nowDir);
	}

	private static class FileList extends JList<FileItem> {
		private File nowDir;
		private FileOpenListener fileOpenListener;

		public FileList() {
			// TODO Auto-generated constructor stub
			setCellRenderer(new FileListCellRenderer());
			setModel(new FileListModel());

			addMouseListener(new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent e) {
					// TODO Auto-generated method stub
					super.mouseClicked(e);

					if (e.getClickCount() == 2) {
						int index = locationToIndex(e.getPoint());
						if (index >= 0) {
							FileItem v = getModel().getElementAt(index);
							if (v.file.isDirectory())
								openItem(v);
						}
					}
				}
			});
		}

		private void openItem(FileItem item) {
			File[] subFiles;
			if (item.file != null)
				subFiles = fsv.getFiles(item.file, false);
			else
				subFiles = fsv.getRoots();

			((DefaultListModel<FileItem>) getModel()).clear();
			for (int i = 0; i < subFiles.length; i++)
				((DefaultListModel<FileItem>) getModel()).addElement(new FileItem(fsv.getSystemDisplayName(subFiles[i]),
						fsv.getSystemIcon(subFiles[i]), subFiles[i]));

			if (item.file != null)
				nowDir = item.file;

			// 回调监听器
			if (fileOpenListener != null)
				fileOpenListener.fileOpenEvent(nowDir);
		}

		private void returnDir() {
			if (nowDir == null)
				return;

			nowDir = fsv.getParentDirectory(nowDir);
			openItem(new FileItem(fsv.getSystemDisplayName(nowDir), fsv.getSystemIcon(nowDir), nowDir));
		}

		public FileOpenListener getFileOpenListener() {
			return fileOpenListener;
		}

		public void setFileOpenListener(FileOpenListener fileOpenListener) {
			this.fileOpenListener = fileOpenListener;
		}
	}

	private static class FileListModel extends DefaultListModel<FileItem> {
		public FileListModel() {
			// TODO Auto-generated constructor stub
			// 初始化系统根目录
			File[] roots = fsv.getRoots();
			for (int i = 0; i < roots.length; i++)
				addElement(new FileItem(fsv.getSystemDisplayName(roots[i]), fsv.getSystemIcon(roots[i]), roots[i]));
		}
	}

	private static class FileListCellRenderer extends JLabel implements ListCellRenderer<FileItem> {
		public FileListCellRenderer() {
			// TODO Auto-generated constructor stub
			setPreferredSize(new Dimension(getWidth(), 25));
			setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
			setOpaque(true);
		}

		@Override
		public Component getListCellRendererComponent(JList<? extends FileItem> list, FileItem value, int index,
				boolean isSelected, boolean cellHasFocus) {
			// TODO Auto-generated method stub
			setText(value.name);
			setIcon(value.icon);
			if (isSelected) {
				setBackground(list.getSelectionBackground());
				setForeground(list.getSelectionForeground());
			} else {
				setBackground(list.getBackground());
				setForeground(list.getForeground());
			}
			return this;
		}
	}

	// 文件项
	private static class FileItem {
		public String name;// 文件名
		public Icon icon;// 文件图标
		public File file;// 文件

		public FileItem(String name, Icon icon, File file) {
			this.name = name;
			this.icon = icon;
			this.file = file;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值