better memory

This commit is contained in:
Radek Davidek 2026-03-31 13:26:18 +02:00
parent 4e1b4feac7
commit 24798ae9eb

View File

@ -27,6 +27,7 @@ import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Locale; import java.util.Locale;
@ -41,6 +42,8 @@ import java.nio.file.attribute.DosFileAttributes;
* Single tab in a panel - displays the contents of one directory * Single tab in a panel - displays the contents of one directory
*/ */
public class FilePanelTab extends JPanel { public class FilePanelTab extends JPanel {
private static final int MAX_ICON_CACHE_ENTRIES =
Integer.getInteger("kfmanager.iconCache.maxEntries", 128);
private File currentDirectory; private File currentDirectory;
private JTable fileTable; private JTable fileTable;
@ -1348,6 +1351,7 @@ public class FilePanelTab extends JPanel {
briefCurrentColumn = 0; briefCurrentColumn = 0;
lastValidRow = 0; lastValidRow = 0;
lastValidBriefColumn = 0; lastValidBriefColumn = 0;
iconCache.clear();
} }
List<FileItem> items = (preloadedItems != null) ? preloadedItems : createFileItemList(directory); List<FileItem> items = (preloadedItems != null) ? preloadedItems : createFileItemList(directory);
@ -3141,7 +3145,12 @@ public class FilePanelTab extends JPanel {
fileTable.getColumnModel().getColumn(i).setCellRenderer(renderer); fileTable.getColumnModel().getColumn(i).setCellRenderer(renderer);
} }
} }
private final java.util.Map<String, Icon> iconCache = new java.util.HashMap<>(); private final Map<String, Icon> iconCache = new LinkedHashMap<>(128, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, Icon> eldest) {
return size() > MAX_ICON_CACHE_ENTRIES;
}
};
private final FileSystemView fileSystemView = FileSystemView.getFileSystemView(); private final FileSystemView fileSystemView = FileSystemView.getFileSystemView();
private Icon getItemIcon(FileItem item) { private Icon getItemIcon(FileItem item) {
@ -3159,7 +3168,7 @@ public class FilePanelTab extends JPanel {
FileSpecificIcon.Type fileType = FileSpecificIcon.getFileType(name); FileSpecificIcon.Type fileType = FileSpecificIcon.getFileType(name);
if (isExecutableWithEmbeddedIcon(item, fileType)) { if (isExecutableWithEmbeddedIcon(item, fileType)) {
File file = item.getFile(); File file = item.getFile();
key = "FILE_EMBEDDED_" + file.getAbsolutePath() + "_" + file.lastModified(); key = "FILE_EMBEDDED_" + file.getAbsolutePath();
} else { } else {
key = "FILE_" + fileType; key = "FILE_" + fileType;
} }
@ -3217,16 +3226,20 @@ public class FilePanelTab extends JPanel {
return icon; return icon;
} }
BufferedImage image = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics(); Graphics2D g2 = image.createGraphics();
try { try {
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2.scale(
(double) width / Math.max(1, icon.getIconWidth()),
(double) height / Math.max(1, icon.getIconHeight())
);
icon.paintIcon(null, g2, 0, 0); icon.paintIcon(null, g2, 0, 0);
} finally { } finally {
g2.dispose(); g2.dispose();
} }
Image scaled = image.getScaledInstance(width, height, Image.SCALE_SMOOTH); return new ImageIcon(image);
return new ImageIcon(scaled);
} }
private int calculateCurrentColumnWidth() { private int calculateCurrentColumnWidth() {