要保证隐私性的话,就只能让用户看到自己的文件夹,就不能只是用文件选择器,可以用文件选择器加上遍历文件,把对应的文件夹的文件取出来,放在窗体上面。
对文件的操作,我们还需要进行上传和下载,那么就涉及到文件的多选操作。对每一个取出来的文件加上复选框,再在窗体上加上上传下载按钮
先重写一下文件列表的窗体
让文件选择放在主窗体中,不是上一版的浮动的文件选择器,
JPanel jp = new JPanel();
jp.setBackground(Color.DARK_GRAY);
File[] files = filePath.listFiles();
DefaultListModel<JCheckBox> listModel = new DefaultListModel<>();
for (int i = 0; i < files.length; i++) {
File f = files[i];
JCheckBox btn = new JCheckBox(f.getName());
listModel.add(i, btn);
}
JList<JCheckBox> fileList = new JList<>(listModel);
// 添加鼠标监听器以处理选中
fileList.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int index = fileList.locationToIndex(e.getPoint());
if (index != -1) {
JCheckBox checkBox = listModel.getElementAt(index);
checkBox.setSelected(!checkBox.isSelected());
fileList.repaint(fileList.getCellBounds(index, index));
}
}
});
这段代码把传进来的文件名遍历了一遍,仅遍历一级,放在JList中
在listModel中,存放了文件对应的复选框,也就是说,目的是创建一个带有复选框的文件列表,用户可以通过点击复选框来选择或取消选择文件
接下来写一个单元格渲染器,来对复选的文件进行操作
// 创建单元格渲染器,以便在JList中显示JCheckBox
fileList.setCellRenderer(new JCheckBoxRenderer());
System.out.println("单元格渲染器被调用");
//设置了 JList 的单元格渲染器为 JCheckBoxRenderer,这样列表中的每个项都会显示一个复选框
JScrollPane jsp = new JScrollPane(fileList);
jsp.setPreferredSize(new Dimension(550, 400));
JButton upbtn = new JButton("上传");
JButton downbtn = new JButton("下载");
jp.add(jsp);
jp.add(upbtn);
jp.add(downbtn);
downbtn.addActionListener(e -> {
String pwd = JOptionPane.showInputDialog("请输入解密密码:");
if (pwd.equals("test")) {//当前解密密码唯一,为“text”
for (int i = 0; i < listModel.getSize(); i++) {
JCheckBox jCheckBox = listModel.get(i);
if (jCheckBox.isSelected()) {
System.out.println(jCheckBox.getText());//点击下载后仅有打印文件操作,待续
}
}
JOptionPane.showMessageDialog(jp, "下载成功!");
} else {
JOptionPane.showMessageDialog(jp, "密码错误!");
}
});
这段代码主要是让复选框能接上后续操作,并连接上下载按钮
最后还有个内部类
public Component getListCellRendererComponent
(JList<? extends JCheckBox> list, JCheckBox value, int index, boolean isSelected, boolean cellHasFocus) {
setEnabled(list.isEnabled());
setSelected(value.isSelected());
setFont(list.getFont());
setBackground(list.getBackground());
setForeground(list.getForeground());
setText(value.getText());
return this;
}
方法体:
setEnabled(list.isEnabled())
:设置复选框的启用状态,使其与列表的启用状态一致。setSelected(value.isSelected())
:设置复选框的选中状态,使其与传入的JCheckBox
的选中状态一致。setFont(list.getFont())
:设置复选框的字体,使其与列表的字体一致。setBackground(list.getBackground())
:设置复选框的背景颜色,使其与列表的背景颜色一致。setForeground(list.getForeground())
:设置复选框的前景颜色,使其与列表的前景颜色一致。setText(value.getText())
:设置复选框的文本,即文件名。
目前还没写好二级密码传入,仅用一个硬密码“text”
上传下载按钮的后续操作暂未写
待续