使用 Swing 在窗格中选择文件

2023-12-09

我正在 Swing 中编写一个 GUI,我想在主窗口中创建一个文件选择器,如下图所示:

enter image description here

虽然似乎有很多关于如何编写弹出文件选择器的教程,但我没有看到太多关于如何在 swing 中完成这种类型的选择器的信息。

也很抱歉,如果之前有人问过这个问题,我做了很多搜索,但找不到其他任何东西。


PanelBrowser如下所示,是一个基本原型,其功能类似于Mac OS X 查找器您问题中所示的列视图。

PanelBrowser

更新:添加了水平滚动和更多文件信息。

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.io.File;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileSystemView;

/**
 * @see http://stackoverflow.com/a/15104660/230513
 */
public class PanelBrowser extends Box {

    private static final Dimension SIZE = new Dimension(200, 300);
    private List<FilePanel> list = new ArrayList<FilePanel>();

    public PanelBrowser(File root) {
        super(BoxLayout.LINE_AXIS);
        setBackground(Color.red);
        FilePanel panel = new FilePanel(this, root);
        list.add(panel);
        this.add(panel);
    }

    private void update(FilePanel fp, File file) {
        int index = list.indexOf(fp);
        int i = list.size() - 1;
        while (i > index) {
            list.remove(i);
            this.remove(i);
            i--;
        }
        final FilePanel panel = new FilePanel(this, file);
        list.add(panel);
        this.add(panel);
        revalidate();
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                scrollRectToVisible(panel.getBounds());
            }
        });
    }

    private static class FilePanel extends Box {

        private static FileSystemView fsv = FileSystemView.getFileSystemView();
        private static DateFormat df = DateFormat.getDateTimeInstance(
            DateFormat.SHORT, DateFormat.DEFAULT);
        private PanelBrowser parent;
        private JList list;

        public FilePanel(PanelBrowser parent, File file) {
            super(BoxLayout.PAGE_AXIS);
            this.parent = parent;
            DefaultListModel model = new DefaultListModel();
            if (file.isFile()) {
                JLabel name = new JLabel(file.getName());
                name.setIcon(fsv.getSystemIcon(file));
                this.add(name);
                Date d = new Date(file.lastModified());
                JLabel mod = new JLabel("Date: " + df.format(d));
                this.add(mod);
                final String v = String.valueOf(file.length());
                JLabel length = new JLabel("Size: " + v);
                this.add(length);
            }
            if (file.isDirectory()) {
                for (File f : file.listFiles()) {
                    model.addElement(f);
                }
                list = new JList(model);
                list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                list.setCellRenderer(new FileRenderer());
                list.addListSelectionListener(new SelectionHandler());
                this.add(new JScrollPane(list) {
                    @Override
                    public int getVerticalScrollBarPolicy() {
                        return JScrollPane.VERTICAL_SCROLLBAR_ALWAYS;
                    }
                });
            }
        }

        private static class FileRenderer extends DefaultListCellRenderer {

            @Override
            public Component getListCellRendererComponent(JList list, Object value,
                int index, boolean isSelected, boolean cellHasFocus) {
                JLabel label = (JLabel) super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);
                File f = (File) value;
                setText(f.getName());
                setIcon(fsv.getSystemIcon(f));
                return label;
            }
        }

        private class SelectionHandler implements ListSelectionListener {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    File f = (File) list.getSelectedValue();
                    parent.update(FilePanel.this, f);
                }
            }
        }

        @Override
        public Dimension getMinimumSize() {
            return new Dimension(SIZE);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(SIZE);
        }

        @Override
        public Dimension getMaximumSize() {
            return new Dimension(SIZE.width, Short.MAX_VALUE);
        }
    }

    private static void display() {
        String path = System.getProperty("user.dir");
        PanelBrowser browser = new PanelBrowser(new File(path));
        JFrame f = new JFrame(path);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new JScrollPane(browser) {
            @Override
            public int getVerticalScrollBarPolicy() {
                return JScrollPane.VERTICAL_SCROLLBAR_NEVER;
            }
        });
        f.pack();
        f.setSize(4 * SIZE.width, SIZE.height);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                display();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Swing 在窗格中选择文件 的相关文章

随机推荐

  • 使用 LINQ 在 C# 中合并字典

    我有三本字典 比如 Dictionary
  • CoreData 中 NSDictionary 属性的更新未保存

    我在 CoreData 中创建了一个实体 其中包含作为 NSDictionary 实现的 Transformable 属性类型 NSDictionary 属性仅包含自定义类的值 自定义类的属性都是NSString类型 自定义类符合 NSCo
  • 将 JSON 对象反序列化为嵌套 C# 对象

    Edit 我想我应该提到我无法控制 JSON 并且我知道通常我的 C 对象应该与 JSON 匹配 我的问题不是 为什么这不反序列化 我知道为什么不是 我问是否有一种方法可以按照我要求的方式反序列化 JSON 我正在使用 Newtonsoft
  • 将 for 循环转换为向量(向量化)

    对于那些超级专家 我想知道您是否看到一种快速方法将以下 for 循环转换为更有效的单行向量计算 Define A size n 1 B size n m C size n 1 B 2 200 3 300 4 400 C 1 2 1 for
  • 以下用于添加到内存引用的字节说明符在 NASM 汇编器中起什么作用?

    下面的代码 section data Snippet db KANGAROO section text global start start mov ebx Snippet add byte ebx 32 将 BX 中的内存地址所指的数字加
  • Swift 字符串文字赋值给 C 变量

    在 Swift 中 当调用 C 函数时 Swift 字符串作为参数传递时会自动强制转换为 CString 但是 在填写 C 结构体或全局变量时 我没有得到相同的行为 strlen swiftString Works CGlobalStruc
  • Asp.net mvc 多对多关系视图

    大家好 我创建了几个实现多对多关系的模型 现在我在正确格式化 设计 创建和编辑 视图时遇到问题 这是我的模型 学生模型 namespace HMS Models Table Students Schema Admission public
  • 使用 Cognito 用户池,而不使用 Cognito 联合身份(身份池)

    我只想使用 Cognito 用户池 因此我想将身份联合与 Cognito 用户池一起使用 而不使用 Cognito 联合身份 身份池 我已按照文档进行操作 但无法成功 http docs aws amazon com cognito lat
  • 如何使用 canvas 和 Kinetic.js 裁剪图像

    我的函数绘制一个图像 并使用 Kinetic js 在另一层上绘制另一个图像 但我想裁剪名为 smsTopBg image 的第二个图像 window onload function INITIALISATION var stage new
  • Android Google Drive API 异常:403 禁止

    我正在开发一个可以访问 Google Drive 上用户的 appdata 文件夹的应用程序 当我处于调试模式时 该应用程序运行良好 当我发布应用程序并尝试连接到 Google Drive 时 在选择要连接的帐户后 它会出现此错误 com
  • 如何从TSQL调用Web服务? (SQL 服务器 2000)

    我想从 SQL Server 2000 中的 TSQL 调用 Web 服务 我尝试使用以下代码 Declare Object as Int Declare ResponseText as Varchar 8000 Exec sp OACre
  • 在 Javascript 中打印 div 标签的内容而不使用弹出窗口

    我正在努力打印 div 标签的内容而不弹出窗口 我的代码现在看起来像这样 var DocumentContainer document getElementById print var WindowObject window open Co
  • 折叠 git 存储库的历史记录

    我们有一个有着悠久历史的 git 项目 具体来说 在项目早期 项目中有相当多的二进制资源文件 这些文件现在已被删除 因为它们实际上是外部资源 然而 由于之前已提交这些文件 我们的存储库的大小 gt 200MB 当前总签出约为20MB 我们想
  • Prolog 递归计算列表中的数字

    我需要一个程序来计算列表中的所有数字 无论它们嵌套得有多深 我能够在数字不在另一个列表内的情况下对数字进行计数 但通过深度嵌套元素进行递归是行不通的 到目前为止我有这个 count 0 count H Tail N count Tail N
  • 使用 Python 搜索 PDF 中的文本? [复制]

    这个问题在这里已经有答案了 Problem我试图通过搜索文本来确定文档的类型 例如诉状 信件 传票等 最好使用 python 所有 PDF 都是可搜索的 但我还没有找到使用 python 解析它并应用脚本来搜索它的解决方案 不需要先将其转换
  • 调整 nginx worker_process 以获得每分钟 10 万次点击

    我们有一台服务于一个 html 文件的服务器 现在服务器有 2 个 CPU 和 2GB 内存 从 blitz io 来看 我们每分钟获得约 12k 个连接 在 60 秒内有 200 个超时 每秒有 250 个并发连接 worker proc
  • unicodedata.digit 和 unicodedata.numeric 之间有什么区别?

    From 统一码数据 doc unicodedata digit chr default 返回分配给的数字值 字符 chr 作为整数 如果没有定义这样的值 则默认为 返回 或者 如果未给出 则引发 ValueError unicodedat
  • 从Python执行页面上的JS代码

    我的任务是使用 Python 从任何网页获取命名函数的列表 我有一个使用 JavaScript 编写的脚本 它满足我的需要 加载页面后 我可以从 JS 控制台运行脚本 例如 从 GoogleChrome 中的开发工具 我得到了函数名称数组作
  • 上传错误#2038

    每当我使用此脚本进行测试时 它在上传尝试时都会不断失败并给出错误 IO 2038我可以肯定地说的是它甚至永远不会到达 Upload ashx 的后端脚本 这告诉我脚本有问题 现在我正在我的测试机器上使用 localhost 执行此操作 ht
  • 使用 Swing 在窗格中选择文件

    我正在 Swing 中编写一个 GUI 我想在主窗口中创建一个文件选择器 如下图所示 虽然似乎有很多关于如何编写弹出文件选择器的教程 但我没有看到太多关于如何在 swing 中完成这种类型的选择器的信息 也很抱歉 如果之前有人问过这个问题