hw3: PhotoAlbumView: add thumbnails, date, file size to list

This commit is contained in:
Yuri Tatishchev 2025-03-25 00:31:55 -07:00
parent 528254c9bc
commit b12cf9f6d2
Signed by: CaZzzer
GPG Key ID: E0EBF441EA424369

View File

@ -38,9 +38,21 @@ public class PhotoAlbumView extends JFrame implements PhotoAlbumModel.ModelChang
deleteButton = new JButton("Delete Photo");
previousButton = new JButton("Previous");
nextButton = new JButton("Next");
// Disable navigation buttons by default
previousButton.setEnabled(false);
nextButton.setEnabled(false);
deleteButton.setEnabled(false);
String[] sortOptions = {"Sort by Name", "Sort by Date", "Sort by Size"};
sortingCombo = new JComboBox<>(sortOptions);
// Select default sorting option
sortingCombo.setSelectedIndex(1);
listModel = new DefaultListModel<>();
photoList = new JList<>(listModel);
photoList.setEnabled(false);
photoList.setCellRenderer(new PhotoListCellRenderer());
photoList.setFixedCellHeight(60); // Accommodate thumbnails
}
private void setupLayout() {
@ -64,14 +76,6 @@ public class PhotoAlbumView extends JFrame implements PhotoAlbumModel.ModelChang
controlPanel.add(deleteButton);
controlPanel.add(sortingCombo);
add(controlPanel, BorderLayout.SOUTH);
// Disable navigation buttons by default
previousButton.setEnabled(false);
nextButton.setEnabled(false);
deleteButton.setEnabled(false);
// Select default sorting option
sortingCombo.setSelectedIndex(1);
}
public void setController(PhotoAlbumController controller) {
@ -83,14 +87,6 @@ public class PhotoAlbumView extends JFrame implements PhotoAlbumModel.ModelChang
nextButton.addActionListener(e -> controller.handleNext());
previousButton.addActionListener(e -> controller.handlePrevious());
sortingCombo.addActionListener(e -> controller.handleSort(sortingCombo.getSelectedIndex()));
photoList.addListSelectionListener(e -> {
if (!e.getValueIsAdjusting()) {
int index = photoList.getSelectedIndex();
if (index >= 0) {
controller.handlePhotoSelection(index);
}
}
});
}
@Override
@ -141,4 +137,68 @@ public class PhotoAlbumView extends JFrame implements PhotoAlbumModel.ModelChang
return null;
}
}
private class PhotoListCellRenderer extends JPanel implements ListCellRenderer<String> {
private final JLabel imageLabel = new JLabel();
private final JLabel textLabel = new JLabel();
private final JLabel detailsLabel = new JLabel();
public PhotoListCellRenderer() {
setLayout(new BorderLayout(5, 0));
// Left side - image
imageLabel.setPreferredSize(new Dimension(50, 50));
add(imageLabel, BorderLayout.WEST);
// Center - name and details
JPanel textPanel = new JPanel(new GridLayout(2, 1));
textPanel.setOpaque(false);
textLabel.setFont(textLabel.getFont().deriveFont(Font.BOLD));
detailsLabel.setForeground(Color.GRAY);
detailsLabel.setFont(detailsLabel.getFont().deriveFont(10.0f));
textPanel.add(textLabel);
textPanel.add(detailsLabel);
add(textPanel, BorderLayout.CENTER);
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
setOpaque(true);
}
@Override
public Component getListCellRendererComponent(JList<? extends String> list,
String name, int index, boolean isSelected, boolean cellHasFocus) {
textLabel.setText(name);
Photo photo = model.getPhotos().get(index);
ImageIcon thumbnail = loadThumbnail(photo.filePath());
imageLabel.setIcon(thumbnail);
// Format date
String date = String.format("%tF", photo.dateAdded());
// Format file size
String size = formatFileSize(photo.fileSize());
detailsLabel.setText(date + "" + size);
return this;
}
}
private String formatFileSize(long size) {
if (size < 1024 * 1024) {
return String.format("%.1f KB", size / 1024.0);
} else {
return String.format("%.1f MB", size / (1024.0 * 1024));
}
}
private ImageIcon loadThumbnail(String path) {
try {
ImageIcon icon = new ImageIcon(path);
Image img = icon.getImage();
Image scaledImg = img.getScaledInstance(50, 50, Image.SCALE_AREA_AVERAGING);
return new ImageIcon(scaledImg);
} catch (Exception e) {
return null;
}
}
}