Fixed: Proper freeing memory after SWF close 2

This commit is contained in:
Jindra Petřík
2025-05-19 00:40:57 +02:00
parent d163961cab
commit 1069c92c31
7 changed files with 76 additions and 6 deletions
@@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.gui;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.gui.tagtree.AbstractTagTree;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.treeitems.Openable;
import com.jpexs.decompiler.flash.treeitems.TreeItem;
import com.jpexs.helpers.SerializableImage;
import java.awt.Color;
@@ -174,12 +175,13 @@ public class FolderListPanel extends JPanel {
selectedItems.clear();
selectedIndex = -1;
((JScrollPane) getParent().getParent()).getVerticalScrollBar().setValue(0);
}
}
public void clear() {
items = new ArrayList<>();
selectedItems.clear();
selectedIndex = -1;
parentPath = null;
}
@Override
@@ -171,7 +171,7 @@ public class FolderPreviewPanel extends JPanel {
repaint();
((JScrollPane) getParent().getParent()).getVerticalScrollBar().setValue(0);
}
public void clear() {
items = new ArrayList<>();
executor.shutdownNow();
@@ -103,6 +103,7 @@ import javax.swing.plaf.basic.BasicTreeUI;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
@@ -761,6 +762,7 @@ public class GenericTagTreePanel extends GenericTagPanel {
tag = null;
editedTag = null;
tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("root")));
tree.setSelectionModel(new DefaultTreeSelectionModel());
revalidate();
repaint();
}
@@ -1727,7 +1727,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
gcClipboard();
mainMenu.updateComponents(null);
previewPanel.clear();
folderPreviewPanel.clear();
folderListPanel.clear();
previewPanel.clear();
tagInfoPanel.clear();
dumpPreviewPanel.clear();
return true;
}
@@ -1849,8 +1853,24 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
} else {
mainMenu.updateComponents();
}
previewPanel.clear();
folderPreviewPanel.clear();
folderListPanel.clear();
previewPanel.clear();
tagInfoPanel.clear();
dumpPreviewPanel.clear();
List<List<String>> nodes;
//To properly clear cached TreePaths
nodes = View.getExpandedNodes(tagTree);
tagTree.setModel(tagTree.getFullModel());
View.expandTreeNodes(tagTree, nodes);
nodes = View.getExpandedNodes(tagListTree);
tagListTree.setModel(tagListTree.getFullModel());
View.expandTreeNodes(tagListTree, nodes);
doFilter();
return true;
}
@@ -6135,7 +6155,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
folderPreviewPanel.clear();
folderListPanel.clear();
previewPanel.clear();
previewPanel.clear();
tagInfoPanel.clear();
previewPanel.setImageReplaceButtonVisible(false, false, false, false, false, false, false);
@@ -1810,6 +1810,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
binaryPanel.setBinaryData(null);
genericTagPanel.clear();
displayEditGenericPanel.clear();
fontPanel.clear();
}
@@ -109,6 +109,11 @@ public class TagInfoPanel extends JPanel {
buildHtmlContent();
}
public void clear() {
this.tagInfo = new TagInfo(null);
buildHtmlContent();
}
private void updateHtmlContent(boolean expand, boolean showDetails) {
String categoryName = "general";
StringBuilder result = new StringBuilder();
@@ -117,6 +122,10 @@ public class TagInfoPanel extends JPanel {
List<TagInfo.TagInfoItem> items = tagInfo.getInfos().get(categoryName);
if (items == null) {
items = new ArrayList<>();
}
if (View.isOceanic()) {
result.append("<tr bgcolor='#FDFDFD'>");
} else {
@@ -107,6 +107,7 @@ import com.jpexs.decompiler.flash.types.CLIPACTIONRECORD;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
@@ -221,6 +222,40 @@ public abstract class AbstractTagTree extends JTree {
setHashColor(Color.gray);
}
}
@Override
protected MouseListener createMouseListener() {
MouseListener handler = super.createMouseListener();
return new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
handler.mouseClicked(e);
}
@Override
public void mousePressed(MouseEvent e) {
handler.mousePressed(e);
}
@Override
public void mouseReleased(MouseEvent e) {
handler.mouseReleased(e);
}
@Override
public void mouseEntered(MouseEvent e) {
handler.mouseEntered(e);
}
@Override
public void mouseExited(MouseEvent e) {
handler.mouseReleased(e); //crucial to properly free nodes
handler.mouseExited(e);
}
};
}
});
ToolTipManager.sharedInstance().registerComponent(this);
addMouseListener(new MouseAdapter() {