From da2dc4cd5ae949e6f3767e2a580cbbe55954d3a2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 30 Jan 2014 17:35:12 +0100 Subject: [PATCH] Some changes to prevent memory leaks from gamePane (not fiished yet). --- .../src/main/java/mage/client/MageFrame.java | 33 ++++++++++++------- .../mage/client/dialog/FeedbackDialog.java | 1 + .../java/mage/client/game/FeedbackPanel.java | 2 +- .../main/java/mage/client/game/GamePane.java | 11 ++++++- .../main/java/mage/client/game/GamePanel.java | 26 ++++++++++----- 5 files changed, 51 insertions(+), 22 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index ce3b5205b00..67f29b6318f 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -147,9 +147,9 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { private static Session session; private ConnectDialog connectDialog; - private ErrorDialog errorDialog; + private final ErrorDialog errorDialog; private static CallbackClient callbackClient; - private static Preferences prefs = Preferences.userNodeForPackage(MageFrame.class); + private static final Preferences prefs = Preferences.userNodeForPackage(MageFrame.class); private JLabel title; private Rectangle titleRectangle; private static final MageVersion version = new MageVersion(1, 3, 0, ""); @@ -159,13 +159,13 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { //TODO: make gray theme, implement theme selector in preferences dialog private static boolean grayMode = false; - private static Map chats = new HashMap(); - private static Map games = new HashMap(); - private static Map drafts = new HashMap(); - private static Map tournaments = new HashMap(); - private static MageUI ui = new MageUI(); + private static final Map chats = new HashMap(); + private static final Map games = new HashMap(); + private static final Map drafts = new HashMap(); + private static final Map tournaments = new HashMap(); + private static final MageUI ui = new MageUI(); - private static ScheduledExecutorService pingTaskExecutor = Executors.newSingleThreadScheduledExecutor(); + private static final ScheduledExecutorService pingTaskExecutor = Executors.newSingleThreadScheduledExecutor(); private static long startTime; @@ -579,6 +579,12 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { return topmost; } + /** + * Shows a game for a player of the game + * + * @param gameId + * @param playerId + */ public void showGame(UUID gameId, UUID playerId) { try { GamePane gamePane = new GamePane(); @@ -1133,13 +1139,18 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { chats.remove(chatId); } + public static void addGame(UUID gameId, GamePanel gamePanel) { + games.put(gameId, gamePanel); + } + public static GamePanel getGame(UUID gameId) { return games.get(gameId); } - public static void addGame(UUID gameId, GamePanel gamePanel) { - games.put(gameId, gamePanel); + public static void removeGame(UUID gameId) { + games.remove(gameId); } + public static DraftPanel getDraft(UUID draftId) { return drafts.get(draftId); @@ -1230,7 +1241,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } class MagePaneMenuItem extends JCheckBoxMenuItem { - private MagePane frame; + private final MagePane frame; public MagePaneMenuItem(MagePane frame) { super(frame.getTitle()); diff --git a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java index bd9ee61cb21..dc3c892658e 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/FeedbackDialog.java @@ -228,6 +228,7 @@ public class FeedbackDialog extends javax.swing.JDialog { private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed dialog.setVisible(false); + dialog.dispose(); }//GEN-LAST:event_cancelButtonActionPerformed private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sendButtonActionPerformed diff --git a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java index 345844260f7..7ed55896b26 100644 --- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java @@ -222,7 +222,7 @@ public class FeedbackPanel extends javax.swing.JPanel { logger.debug("feedback - clear"); } - public void customInitComponents() { + private void customInitComponents() { btnRight = new javax.swing.JButton(); btnLeft = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); diff --git a/Mage.Client/src/main/java/mage/client/game/GamePane.java b/Mage.Client/src/main/java/mage/client/game/GamePane.java index 96d7e6b14c6..3bd0a004592 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePane.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePane.java @@ -34,10 +34,13 @@ package mage.client.game; +import java.beans.PropertyVetoException; import mage.client.*; import javax.swing.*; import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -65,7 +68,13 @@ public class GamePane extends MagePane { } public void hideGame() { - gamePanel.hideGame(); + try { + gamePanel.hideGame(); + this.setClosed(true); + } catch (PropertyVetoException ex) { + Logger.getLogger(GamePane.class.getName()).log(Level.SEVERE, "GamePane could not be closed", ex); + this.dispose(); + } } public void watchGame(UUID gameId) { diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 4284c082cda..f7ce28406af 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -73,16 +73,16 @@ public final class GamePanel extends javax.swing.JPanel { private static final Logger logger = Logger.getLogger(GamePanel.class); private static final String YOUR_HAND = "Your hand"; - private static final int X_PHASE_WIDTH = 55; - private Map players = new HashMap(); - private Map exiles = new HashMap(); - private Map revealed = new HashMap(); - private Map lookedAt = new HashMap(); + private static final int X_PHASE_WIDTH = 55; + private final Map players = new HashMap(); + private final Map exiles = new HashMap(); + private final Map revealed = new HashMap(); + private final Map lookedAt = new HashMap(); private UUID gameId; private UUID playerId; private Session session; private ReplayTask replayTask; - private PickNumberDialog pickNumber; + private final PickNumberDialog pickNumber; private JLayeredPane jLayeredPane; private String chosenHandKey = "You"; private boolean smallMode = false; @@ -157,12 +157,17 @@ public final class GamePanel extends javax.swing.JPanel { } public void cleanUp() { + MageFrame.removeGame(gameId); saveDividerLocations(); this.gameChatPanel.disconnect(); this.players.clear(); - logger.debug("players clear."); this.pnlBattlefield.removeAll(); - pickNumber.hideDialog(); + + this.getUI().uninstallUI(this); + + if (pickNumber != null) { + pickNumber.removeDialog(); + } for (ExileZoneDialog exile: exiles.values()) { exile.hideDialog(); } @@ -174,7 +179,7 @@ public final class GamePanel extends javax.swing.JPanel { popupContainer.setVisible(false); } catch (InterruptedException ex) { logger.fatal("popupContainer error:", ex); - } + } } private void saveDividerLocations() { @@ -315,6 +320,9 @@ public final class GamePanel extends javax.swing.JPanel { } } + /** + * Closes the game and it's resources + */ public void hideGame() { cleanUp(); Component c = this.getParent();