Voici Une solution au problème de fuite de mémoire removeAll() ...
Je l'appelle l'anéantissement des composants.
Ce n'est pas très efficace et je ne recommanderais pas de l'utiliser sauf si vous en avez vraiment besoin.
Il peut être accéléré en spécifiant les types d'écouteurs à rechercher.
Remarque: Il supprime le LayoutManager du panneau, vous devez donc l'ajouter de nouveau.
Exemples d'utilisation:
Utils.annihilateComponent(myJPanel,null,null); // This is slow if myJPanel has many components
myJpanel.setLayout(new FlowLayout());
Utils.annihilateComponent(myJPanel,new String[]{"Action","Mouse","PopupMenu"},new String[]{"java.awt.event.","javax.swing.event."});
myJPanel.setLayout(new MigLayout());
myJPanel.add(new JLabel("Once you start using MigLayout you'll never look back"),"wrap");
//In an JDialog:
private void formWindowClosing(java.awt.event.WindowEvent evt) {
Utils.annihilateComponent(this);
}
Voici le code:
import java.awt.*;
import java.lang.reflect.Method;
import java.util.EventListener;
public class Utils {
private static String[] allPackages = { "java.awt.event.","javax.swing.event.","java.beans.","java.beans.beancontext."
,"java.awt.dnd.","javax.sql.","javax.naming.event.","javax.imageio.event.","javax.net.ssl.","javax.sound.midi."
,"javax.naming.ldap.","java.util.prefs.","javax.sound.sampled." };
public static void removeListeners (Object o, String listenerName, String[] packages) {
Class oc = o.getClass();
try {
Method getListenersMethod = oc.getMethod("get"+listenerName+"Listeners",(Class[])null);
String[] p;
if (packages == null) {
p = allPackages;
} else {
p = packages;
}
// Find the listener Class
Class listenerClass = null;
int pIndex = 0;
while (listenerClass == null && pIndex < p.length) {
try {
listenerClass = Class.forName(p[pIndex]+listenerName+"Listener");
} catch (Exception ex) {
/* Ignore */
}
pIndex++;
}
if (listenerClass == null) {
return; // Couldn't find the class for this listener type
}
Method removeListenerMethod = oc.getMethod("remove"+listenerName+"Listener", new Class[] { listenerClass });
if (getListenersMethod != null) {
//res1 = m.invoke(dto1,(Object[])null);
Object els = getListenersMethod.invoke(o,(Object[])null);
if (els instanceof EventListener[]) {
EventListener[] listeners = (EventListener[])els;
for (int i = 0; i < listeners.length; i++) {
removeListenerMethod.invoke(o, new Object[] { listeners[i] });
}
}
}
} catch (Exception e) {
// Ignore
}
}
private static String[] allListeners = { "Action","Adjustment","Ancestor","AWTEvent","BeanContextMembership","BeanContextServiceRevoked"
,"BeanContextServices","Caret","CellEditor","Change","Component","ConnectionEvent","Container","ControllerEvent"
,"Document","DragGesture","DragSource","DragSourceMotion","DropTarget","Focus","HandshakeCompleted","HierarchyBounds"
,"Hierarchy","Hyperlink","IIOReadProgress","IIOReadUpdate","IIOReadWarning","IIOWriteProgress","IIOWriteWarning"
,"InputMethod","InternalFrame","Item","Key","Line","ListData","ListSelection","MenuDragMouse","MenuKey","Menu"
,"MetaEvent","MouseInput","Mouse","MouseMotion","MouseWheel","NamespaceChange","Naming","NodeChange","ObjectChange"
,"PopupMenu","PreferenceChange","PropertyChange","RowSet","SSLSessionBinding","TableColumnModel","TableModel"
,"Text","TreeExpansion","TreeModel","TreeSelection","TreeWillExpand","UndoableEdit","UnsolicitedNotification"
,"VetoableChange","WindowFocus","Window","WindowState" } ;
public static void removeAllListeners(Component c, String[] listeners, String[] packages) {
String[] l;
if (listeners == null) {
l = allListeners;
} else {
l = listeners;
}
for (int i = 0; i < l.length; i++) {
removeListeners(c,l[i],packages);
}
}
public static void annihilateComponent(Object o, String[] listeners, String[] packages) {
if (o == null) {
return;
}
if (o instanceof Container) {
Component[] c = ((Container)o).getComponents();
for (int i = 0; i < c.length; i++) {
annihilateComponent(c[i],listeners,packages);
}
((Container)o).setLayout(null);
((Container)o).setFocusTraversalPolicy(null);
((Container)o).removeAll();
}
if (o instanceof javax.swing.JScrollPane) {
((javax.swing.JScrollPane)o).setViewportView(null);
}
if (o instanceof Component) {
removeAllListeners((Component)o,listeners,packages);
}
if (o instanceof Window) {
((Window)o).dispose();
}
}
public static void annihilateComponent(Object o) {
annihilateComponent(o,null,null);
}
}
Juste curieux de savoir pourquoi vous marquer tous ces composants comme "finale." Voulez-vous vraiment que ces valeurs soient attribuées une seule fois et/ou essayez-vous d'obtenir un gain de performance? De plus, de combien de composants GUI parle-t-on dans la méthode "buildGUI()"? 5 de plus? 100 de plus? 1 million de plus? – JasCav
Est-ce que le responsePanel a une disposition personnalisée par hasard? – user101884
J'utilise l'outil SWTDesign dans Eclipse pour générer automatiquement le code de l'interface graphique, c'est pourquoi tout est marqué comme final. En réalité, le composant GUI ne devrait jamais changer parce que c'est une sorte de sortie seulement. Le ResponsePannel est comme GridBagLayout. Toujours aucune idée de comment résoudre ce problème. –