Hello,
Je viens de commencer à utiliser MyDoggy et mauvaise surprise... ça bloque les composants qui l'ont utilisé...
Classe de test "paste and go" :
(uniquement les librairies MyDoggy dans le classpath avec le TableLayout fourni dans le bundle)
Cette classe ouvre une frame avec 4 boutons, le premier ouvrir une frame utilisant mydoggy, la seconde ouvre une frame normale, le troisième permet de fermer via un dispose() toutes les frames ouvertes (hormis la principale) et le dernier lance un System.gc().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import org.noos.xing.mydoggy.plaf.MyDoggyToolWindowManager; /** * Test frame for memory problem in MyDoggy */ public class MyDoggyMemoryTestFrame extends JFrame implements ActionListener { enum MAction { MYDOGGY, NORMAL, DISPOSE_ALL, GC, } public MyDoggyMemoryTestFrame() { super("MyDoggy memory-test"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initComponents(); } private void initComponents() { JButton mydoggyFrameButton = new JButton("MyDoggy"); mydoggyFrameButton.setActionCommand(MAction.MYDOGGY.name()); mydoggyFrameButton.addActionListener(this); JButton normalFrameButton = new JButton("Normal"); normalFrameButton.setActionCommand(MAction.NORMAL.name()); normalFrameButton.addActionListener(this); JButton disposeAllButton = new JButton("Dispose all"); disposeAllButton.setActionCommand(MAction.DISPOSE_ALL.name()); disposeAllButton.addActionListener(this); JButton garbageCollectorButton = new JButton("Run GC"); garbageCollectorButton.setActionCommand(MAction.GC.name()); garbageCollectorButton.addActionListener(this); getContentPane().setLayout(new FlowLayout()); getContentPane().add(mydoggyFrameButton); getContentPane().add(normalFrameButton); getContentPane().add(disposeAllButton); getContentPane().add(garbageCollectorButton); pack(); } /* (non-Javadoc) * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { if (MAction.MYDOGGY.name().equals(e.getActionCommand())) { MyDoggyFrame frame = new MyDoggyFrame(); frame.setVisible(true); } else if (MAction.NORMAL.name().equals(e.getActionCommand())) { NormalFrame frame = new NormalFrame(); frame.setVisible(true); } else if (MAction.DISPOSE_ALL.name().equals(e.getActionCommand())) { // Retrieve all active frames Frame[] frames = Frame.getFrames(); for (Frame frame : frames) { if (frame != this) { frame.dispose(); } } } else if (MAction.GC.name().equals(e.getActionCommand())) { System.gc(); } } public static void main(String[] args) { final MyDoggyMemoryTestFrame frame = new MyDoggyMemoryTestFrame(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { frame.setVisible(true); frame.toFront(); } }); } } class MyDoggyFrame extends JFrame { static int nb; int num = ++nb; public MyDoggyFrame() { super("MyDoggy"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); initComponents(); } private void initComponents() { final MyDoggyToolWindowManager toolWindowManager = new MyDoggyToolWindowManager(this); this.getContentPane().add(toolWindowManager); setSize(200, 200); } @Override protected void finalize() throws Throwable { System.out.println("MyDoggyFrame finalize " + num); super.finalize(); } } class NormalFrame extends JFrame { static int nb; int num = ++nb; public NormalFrame() { super("Normal"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); initComponents(); } private void initComponents() { this.getContentPane().add(new JPanel()); setSize(200, 200); } @Override protected void finalize() throws Throwable { System.out.println("NormalFrame finalize " + num); super.finalize(); } }
Le log affiche désespérément :
"NormalFrame finalize x"
Je suis dégouté... quelqu'un aurait une solution pour libérer correctement la mémoire ? Sinon je crois que je n'aurais pas le choix et on va se tourner vers une solution payante... VLDocking, InfoNode ou Jide Docking Framework...
Merci,
Natha
Partager