import javax.swing.*; import java.awt.*; import java.io.File; import java.util.List; public final class FileSelectionPanel extends JPanel { private final DefaultListModel fileModel; private final JList fileList; public FileSelectionPanel() { super(new BorderLayout(8, 8)); fileModel = new DefaultListModel<>(); fileList = new JList<>(fileModel); fileList.setCellRenderer((list, file, index, selected, focus) -> { String name = file.getName(); if (name.isEmpty()) { name = file.getAbsolutePath(); } JLabel label = new JLabel( name + " — " + getFileSize(file) ); label.setOpaque(true); label.setBorder( BorderFactory.createEmptyBorder(6, 8, 6, 8) ); if (selected) { label.setBackground(list.getSelectionBackground()); label.setForeground(list.getSelectionForeground()); } else { label.setBackground(list.getBackground()); label.setForeground(list.getForeground()); } return label; }); JButton addFilesButton = new JButton("Añadir archivos"); JButton addFolderButton = new JButton("Añadir carpeta"); JButton removeButton = new JButton("Quitar selección"); addFilesButton.addActionListener(event -> selectFiles()); addFolderButton.addActionListener(event -> selectFolder()); removeButton.addActionListener(event -> removeSelectedFiles()); JPanel buttons = new JPanel( new FlowLayout(FlowLayout.LEFT) ); buttons.add(addFilesButton); buttons.add(addFolderButton); buttons.add(removeButton); add(buttons, BorderLayout.NORTH); add(new JScrollPane(fileList), BorderLayout.CENTER); } private void selectFiles() { JFileChooser chooser = new JFileChooser(); chooser.setMultiSelectionEnabled(true); chooser.setFileSelectionMode( JFileChooser.FILES_ONLY ); int result = chooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { for (File file : chooser.getSelectedFiles()) { addFile(file); } } } private void selectFolder() { JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY ); int result = chooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { addFile(chooser.getSelectedFile()); } } private void addFile(File file) { if (!file.exists()) { return; } for (int i = 0; i < fileModel.size(); i++) { if (fileModel.get(i).equals(file)) { return; } } if (file.getName().toLowerCase().endsWith(".lbt")) { JOptionPane.showMessageDialog( this, "No se pueden añadir archivos .lbt para comprimir.", "Archivo no permitido", JOptionPane.WARNING_MESSAGE ); return; } fileModel.addElement(file); } private void removeSelectedFiles() { List selectedFiles = fileList.getSelectedValuesList(); for (File file : selectedFiles) { fileModel.removeElement(file); } } private String getFileSize(File file) { if (file.isDirectory()) { return "Carpeta"; } long bytes = file.length(); if (bytes < 1024) { return bytes + " B"; } if (bytes < 1024 * 1024) { return String.format("%.1f KB", bytes / 1024.0); } if (bytes < 1024L * 1024 * 1024) { return String.format( "%.1f MB", bytes / (1024.0 * 1024.0) ); } return String.format( "%.2f GB", bytes / (1024.0 * 1024.0 * 1024.0) ); } public List getSelectedFiles() { return fileList.getSelectedValuesList(); } }