diff --git a/src/main/java/net/knarcraft/minecraftserverlauncher/profile/ServerLauncherController.java b/src/main/java/net/knarcraft/minecraftserverlauncher/profile/ServerLauncherController.java index 70f3ea9..677a13b 100644 --- a/src/main/java/net/knarcraft/minecraftserverlauncher/profile/ServerLauncherController.java +++ b/src/main/java/net/knarcraft/minecraftserverlauncher/profile/ServerLauncherController.java @@ -379,7 +379,7 @@ public class ServerLauncherController { * Updates the GUI as necessary to display loaded data */ private void executeGUILoadingTasks() { - this.serverLauncherGUI.updateProfiles(); + this.serverLauncherGUI.getControlPanelTab().updateProfiles(); this.serverLauncherGUI.updateWithSavedProfileData(); this.currentProfile.updateConsoles(); if (this.downloadAllJars) { diff --git a/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ControlPanelTab.java b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ControlPanelTab.java new file mode 100644 index 0000000..a1ad38c --- /dev/null +++ b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ControlPanelTab.java @@ -0,0 +1,206 @@ +package net.knarcraft.minecraftserverlauncher.userinterface; + +import net.knarcraft.minecraftserverlauncher.Main; +import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController; +import net.knarcraft.minecraftserverlauncher.server.ServerHandler; +import net.knarcraft.minecraftserverlauncher.utility.BackupUtil; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.IOException; +import java.util.concurrent.Executors; + +public class ControlPanelTab implements ActionListener { + + private JButton startServerButton; + private JButton stopServerButton; + private JButton backupButton; + private JButton addProfileButton; + private JButton deleteProfileButton; + private JComboBox profiles; + private final JPanel controlPanelPanel; + private final ServerLauncherController controller; + private final JLabel lblStatusLabel = new JLabel("Servers are stopped"); + + public ControlPanelTab(JPanel controlPanelPanel) { + this.controlPanelPanel = controlPanelPanel; + this.controller = Main.getController(); + initialize(); + } + + /** + * Sets the text of the status label + * @param text

The new text of the status label

+ */ + public void setStatusText(String text) { + this.lblStatusLabel.setText(text); + } + + /** + * Updates the ServerLauncherGUI components to block a user from doing illegal actions + * + * @param running

Whether the servers are currently running

+ */ + public void updateGUIElementsWhenServersStartOrStop(boolean running) { + boolean stopped = !running; //Most gui is only enabled when the server is stopped rather than running. + profiles.setEnabled(stopped); + addProfileButton.setEnabled(stopped); + deleteProfileButton.setEnabled(stopped); + startServerButton.setEnabled(stopped); + stopServerButton.setEnabled(running); + } + + /** + * Stops all servers + */ + public void stopServers() { + GUI gui = Main.getController().getGUI(); + try { + gui.setStatus("Servers are stopping..."); + ServerHandler.stop(); + } catch (IOException e1) { + gui.showError("Could not stop server."); + e1.printStackTrace(); + } catch (InterruptedException e) { + gui.showError("Could not kill server."); + e.printStackTrace(); + } + } + + /** + * Gets the currently selected profile + * + * @return

The currently selected profile or null

+ */ + public String getSelectedProfile() { + Object selectedProfile = profiles.getSelectedItem(); + if (selectedProfile != null) { + return selectedProfile.toString(); + } else { + return null; + } + + } + + /** + * Updates the profiles combo + */ + public void updateProfiles() { + String selectedProfile = Main.getController().getCurrentProfile().getName(); + this.profiles.removeAllItems(); + for (String profile : Main.getController().getProfileNames()) { + this.profiles.addItem(profile); + } + this.profiles.setSelectedItem(selectedProfile); + } + + /** + * Deletes the selected profile + */ + private void deleteProfile() { + Object selected = profiles.getSelectedItem(); + int answer = JOptionPane.showConfirmDialog(null, + String.format("Do you really want to remove the profile %s?", selected), "Remove profile", + JOptionPane.YES_NO_OPTION + ); + if (answer == JOptionPane.YES_NO_OPTION) { + if (selected != null) { + controller.removeProfile(selected.toString()); + updateProfiles(); + } + } + } + + /** + * Saves the previous profile and loads data from the new profile + */ + private void changeProfile() { + controller.saveState(); + Object current = this.profiles.getSelectedItem(); + if (current != null) { + controller.setCurrentProfile(current.toString()); + } + controller.getGUI().updateWithSavedProfileData(); + controller.getCurrentProfile().updateConsoles(); + } + + private void initialize() { + SpringLayout sl_panel = new SpringLayout(); + controlPanelPanel.setLayout(sl_panel); + + JLabel lblBasicControls = new JLabel("Basic controls"); + sl_panel.putConstraint(SpringLayout.NORTH, lblBasicControls, 10, SpringLayout.NORTH, controlPanelPanel); + controlPanelPanel.add(lblBasicControls); + + startServerButton = new JButton("Start servers"); + sl_panel.putConstraint(SpringLayout.WEST, lblBasicControls, 0, SpringLayout.WEST, startServerButton); + sl_panel.putConstraint(SpringLayout.NORTH, startServerButton, 6, SpringLayout.SOUTH, lblBasicControls); + sl_panel.putConstraint(SpringLayout.WEST, startServerButton, 10, SpringLayout.WEST, controlPanelPanel); + controlPanelPanel.add(startServerButton); + startServerButton.addActionListener(this); + + stopServerButton = new JButton("Stop servers"); + sl_panel.putConstraint(SpringLayout.NORTH, stopServerButton, 0, SpringLayout.NORTH, startServerButton); + sl_panel.putConstraint(SpringLayout.WEST, stopServerButton, 6, SpringLayout.EAST, startServerButton); + controlPanelPanel.add(stopServerButton); + stopServerButton.addActionListener(this); + + JLabel lblProfile = new JLabel("Profile"); + sl_panel.putConstraint(SpringLayout.NORTH, lblProfile, 6, SpringLayout.SOUTH, startServerButton); + sl_panel.putConstraint(SpringLayout.WEST, lblProfile, 10, SpringLayout.WEST, controlPanelPanel); + controlPanelPanel.add(lblProfile); + + addProfileButton = new JButton("+"); + sl_panel.putConstraint(SpringLayout.NORTH, addProfileButton, 6, SpringLayout.SOUTH, lblProfile); + sl_panel.putConstraint(SpringLayout.WEST, addProfileButton, 10, SpringLayout.WEST, controlPanelPanel); + controlPanelPanel.add(addProfileButton); + addProfileButton.addActionListener(this); + + deleteProfileButton = new JButton("-"); + sl_panel.putConstraint(SpringLayout.NORTH, deleteProfileButton, 0, SpringLayout.NORTH, addProfileButton); + sl_panel.putConstraint(SpringLayout.WEST, deleteProfileButton, 6, SpringLayout.EAST, addProfileButton); + controlPanelPanel.add(deleteProfileButton); + deleteProfileButton.addActionListener(this); + + profiles = new JComboBox<>(); + sl_panel.putConstraint(SpringLayout.NORTH, profiles, 0, SpringLayout.NORTH, addProfileButton); + sl_panel.putConstraint(SpringLayout.WEST, profiles, 6, SpringLayout.EAST, deleteProfileButton); + sl_panel.putConstraint(SpringLayout.EAST, profiles, 124, SpringLayout.EAST, deleteProfileButton); + controlPanelPanel.add(profiles); + profiles.addActionListener(this); + + sl_panel.putConstraint(SpringLayout.NORTH, lblStatusLabel, 6, SpringLayout.SOUTH, addProfileButton); + sl_panel.putConstraint(SpringLayout.SOUTH, lblStatusLabel, -10, SpringLayout.SOUTH, controlPanelPanel); + sl_panel.putConstraint(SpringLayout.WEST, lblStatusLabel, 10, SpringLayout.WEST, controlPanelPanel); + sl_panel.putConstraint(SpringLayout.EAST, lblStatusLabel, -10, SpringLayout.EAST, controlPanelPanel); + controlPanelPanel.add(lblStatusLabel); + + backupButton = new JButton("Backup"); + sl_panel.putConstraint(SpringLayout.NORTH, backupButton, 0, SpringLayout.NORTH, startServerButton); + sl_panel.putConstraint(SpringLayout.WEST, backupButton, 6, SpringLayout.EAST, stopServerButton); + controlPanelPanel.add(backupButton); + backupButton.addActionListener(this); + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + Object actionSource = actionEvent.getSource(); + if (actionSource == startServerButton) { + controller.saveState(); + Executors.newSingleThreadExecutor().execute(ServerHandler::startServers); + } else if (actionSource == stopServerButton) { + stopServers(); + } else if (actionSource == backupButton) { + //Run backup in its own thread to prevent locking up + Executors.newSingleThreadExecutor().execute(() -> BackupUtil.backup(controller.getGUI())); + } else if (actionSource == addProfileButton) { + controller.addProfile(JOptionPane.showInputDialog("Profile name: ")); + updateProfiles(); + } else if (actionSource == deleteProfileButton) { + deleteProfile(); + } else if (actionSource == profiles) { + changeProfile(); + } + } +} diff --git a/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherGUI.java b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherGUI.java index d4a7d9b..53dc88c 100644 --- a/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherGUI.java +++ b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherGUI.java @@ -3,8 +3,6 @@ package net.knarcraft.minecraftserverlauncher.userinterface; import net.knarcraft.minecraftserverlauncher.Main; import net.knarcraft.minecraftserverlauncher.profile.Collection; import net.knarcraft.minecraftserverlauncher.profile.ServerLauncherController; -import net.knarcraft.minecraftserverlauncher.server.ServerHandler; -import net.knarcraft.minecraftserverlauncher.utility.BackupUtil; import javax.imageio.ImageIO; import javax.naming.ConfigurationException; @@ -19,7 +17,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Scanner; -import java.util.concurrent.Executors; import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE; import static net.knarcraft.minecraftserverlauncher.utility.CommonFunctions.getResourceAsScanner; @@ -34,25 +31,19 @@ import static net.knarcraft.minecraftserverlauncher.utility.CommonFunctions.getR */ public class ServerLauncherGUI extends MessageHandler implements ActionListener, GUI { - private final JLabel lblStatusLabel = new JLabel("Servers are stopped"); private final ServerLauncherController controller; private Map textStrings; private Tray applicationTray; private JFrame frame; - private JTabbedPane tabbedPane; + private JTabbedPane mainTabbedPane; private JTabbedPane serversPane; private ServerControlTab serverControlTab; + private ControlPanelTab controlPanelTab; private ServerLauncherMenu serverLauncherMenu; - //Basic controls - private JButton startServerButton; - private JButton stopServerButton; - private JButton addServerButton; - private JButton backupButton; - private JButton addProfileButton; - private JButton deleteProfileButton; - private JComboBox profiles; + private JButton addServerTabButton; + private JButton addServerPaneButton; /** * Creates the application window @@ -100,9 +91,17 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener, return this.serversPane; } + /** + * Gets this GUI's control panel tab + * @return

The control panel tab for this GUI

+ */ + public ControlPanelTab getControlPanelTab() { + return this.controlPanelTab; + } + @Override public void setStatus(String text) { - this.lblStatusLabel.setText(text); + controlPanelTab.setStatusText(text); this.logMessage(text); } @@ -121,18 +120,6 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener, return chooser.getSelectedFile(); } - /** - * Updates the profiles combo - */ - public void updateProfiles() { - String selectedProfile = Main.getController().getCurrentProfile().getName(); - this.profiles.removeAllItems(); - for (String profile : Main.getController().getProfileNames()) { - this.profiles.addItem(profile); - } - this.profiles.setSelectedItem(selectedProfile); - } - /** * Gets the server control tab used by this GUI * @@ -163,6 +150,46 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener, serversPane.addTab(collection.getName(), collection.getServerTab().getPanel()); addCloseButtonToServerTab(collection.getName()); } + addAddButtonToServerTab(); + } + + /** + * Adds an add button to the servers tab's tabs + */ + private void addAddButtonToServerTab() { + JPanel tabPanel = new JPanel(); + tabPanel.setLayout(new GridLayout()); + tabPanel.setOpaque(false); + + JPanel tabContentsPanel = new JPanel(new SpringLayout()); + serversPane.addTab("Add tab", tabContentsPanel); + + addServerTabButton = getAddServerButton(true); + addServerTabButton.addActionListener(this); + addServerPaneButton = getAddServerButton(false); + addServerPaneButton.addActionListener(this); + + tabContentsPanel.add(addServerTabButton); + tabPanel.add(addServerPaneButton); + serversPane.setTabComponentAt(serversPane.getTabCount() - 1, tabPanel); + } + + /** + * Gets a button for adding a new server + * @param displayButtonStyle

Whether to show or hide the button's style

+ * @return

A new add server button

+ */ + private JButton getAddServerButton(boolean displayButtonStyle) { + JButton addButton = new JButton("+ Add server"); + if (!displayButtonStyle) { + addButton.setBorder(BorderFactory.createEtchedBorder()); + addButton.setFocusable(false); + addButton.setBorderPainted(false); + addButton.setContentAreaFilled(false); + addButton.setRolloverEnabled(true); + addButton.setUI(new BasicButtonUI()); + } + return addButton; } /** @@ -230,81 +257,20 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener, this.serverLauncherMenu = new ServerLauncherMenu(menuBar, this); - tabbedPane = new JTabbedPane(JTabbedPane.TOP); - frame.getContentPane().add(tabbedPane); + mainTabbedPane = new JTabbedPane(JTabbedPane.TOP); + frame.getContentPane().add(mainTabbedPane); - JPanel panelBasic = new JPanel(); - tabbedPane.addTab("Control panel", null, panelBasic, null); - SpringLayout sl_panel = new SpringLayout(); - panelBasic.setLayout(sl_panel); - - JLabel lblBasicControls = new JLabel("Basic controls"); - sl_panel.putConstraint(SpringLayout.NORTH, lblBasicControls, 10, SpringLayout.NORTH, panelBasic); - panelBasic.add(lblBasicControls); - - startServerButton = new JButton("Start servers"); - sl_panel.putConstraint(SpringLayout.WEST, lblBasicControls, 0, SpringLayout.WEST, startServerButton); - sl_panel.putConstraint(SpringLayout.NORTH, startServerButton, 6, SpringLayout.SOUTH, lblBasicControls); - sl_panel.putConstraint(SpringLayout.WEST, startServerButton, 10, SpringLayout.WEST, panelBasic); - panelBasic.add(startServerButton); - startServerButton.addActionListener(this); - - stopServerButton = new JButton("Stop servers"); - sl_panel.putConstraint(SpringLayout.NORTH, stopServerButton, 0, SpringLayout.NORTH, startServerButton); - sl_panel.putConstraint(SpringLayout.WEST, stopServerButton, 6, SpringLayout.EAST, startServerButton); - panelBasic.add(stopServerButton); - stopServerButton.addActionListener(this); - - JLabel lblProfile = new JLabel("Profile"); - sl_panel.putConstraint(SpringLayout.NORTH, lblProfile, 6, SpringLayout.SOUTH, startServerButton); - sl_panel.putConstraint(SpringLayout.WEST, lblProfile, 10, SpringLayout.WEST, panelBasic); - panelBasic.add(lblProfile); - - addProfileButton = new JButton("+"); - sl_panel.putConstraint(SpringLayout.NORTH, addProfileButton, 6, SpringLayout.SOUTH, lblProfile); - sl_panel.putConstraint(SpringLayout.WEST, addProfileButton, 10, SpringLayout.WEST, panelBasic); - panelBasic.add(addProfileButton); - addProfileButton.addActionListener(this); - - deleteProfileButton = new JButton("-"); - sl_panel.putConstraint(SpringLayout.NORTH, deleteProfileButton, 0, SpringLayout.NORTH, addProfileButton); - sl_panel.putConstraint(SpringLayout.WEST, deleteProfileButton, 6, SpringLayout.EAST, addProfileButton); - panelBasic.add(deleteProfileButton); - deleteProfileButton.addActionListener(this); - - profiles = new JComboBox<>(); - sl_panel.putConstraint(SpringLayout.NORTH, profiles, 0, SpringLayout.NORTH, addProfileButton); - sl_panel.putConstraint(SpringLayout.WEST, profiles, 6, SpringLayout.EAST, deleteProfileButton); - sl_panel.putConstraint(SpringLayout.EAST, profiles, 124, SpringLayout.EAST, deleteProfileButton); - panelBasic.add(profiles); - profiles.addActionListener(this); - - sl_panel.putConstraint(SpringLayout.NORTH, lblStatusLabel, 6, SpringLayout.SOUTH, addProfileButton); - sl_panel.putConstraint(SpringLayout.SOUTH, lblStatusLabel, -10, SpringLayout.SOUTH, panelBasic); - sl_panel.putConstraint(SpringLayout.WEST, lblStatusLabel, 10, SpringLayout.WEST, panelBasic); - sl_panel.putConstraint(SpringLayout.EAST, lblStatusLabel, -10, SpringLayout.EAST, panelBasic); - panelBasic.add(lblStatusLabel); - - addServerButton = new JButton("Add server"); - sl_panel.putConstraint(SpringLayout.NORTH, addServerButton, 0, SpringLayout.NORTH, startServerButton); - sl_panel.putConstraint(SpringLayout.WEST, addServerButton, 6, SpringLayout.EAST, stopServerButton); - panelBasic.add(addServerButton); - addServerButton.addActionListener(this); - - backupButton = new JButton("Backup"); - sl_panel.putConstraint(SpringLayout.NORTH, backupButton, 0, SpringLayout.NORTH, startServerButton); - sl_panel.putConstraint(SpringLayout.WEST, backupButton, 6, SpringLayout.EAST, addServerButton); - panelBasic.add(backupButton); - backupButton.addActionListener(this); + JPanel controlPanelPanel = new JPanel(); + mainTabbedPane.addTab("Control panel", null, controlPanelPanel, null); + controlPanelTab = new ControlPanelTab(controlPanelPanel); JPanel controlServers = new JPanel(); - tabbedPane.addTab("Control servers", null, controlServers, null); + mainTabbedPane.addTab("Control servers", null, controlServers, null); serverControlTab = new ServerControlTab(frame, controlServers); - JPanel panel_2 = new JPanel(); - tabbedPane.addTab("Servers", null, panel_2, null); + mainTabbedPane.addTab("Servers", null, panel_2, null); SpringLayout sl_panel_2 = new SpringLayout(); panel_2.setLayout(sl_panel_2); @@ -332,21 +298,6 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener, applicationTray.hideToTray(); } - /** - * Gets the currently selected profile - * - * @return

The currently selected profile or null

- */ - public String getSelectedProfile() { - Object selectedProfile = profiles.getSelectedItem(); - if (selectedProfile != null) { - return selectedProfile.toString(); - } else { - return null; - } - - } - @Override public void actionPerformed(ActionEvent e) { Object actionSource = e.getSource(); @@ -361,34 +312,8 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener, * @param actionSource

The object being interacted with

*/ private void handleMainTabButtons(Object actionSource) { - if (actionSource == startServerButton) { - controller.saveState(); - Executors.newSingleThreadExecutor().execute(ServerHandler::startServers); - } else if (actionSource == stopServerButton) { - stopServers(); - } else if (actionSource == addServerButton) { + if (actionSource == addServerTabButton || actionSource == addServerPaneButton) { addServer(); - } else if (actionSource == backupButton) { - //Run backup in its own thread to prevent locking up - Executors.newSingleThreadExecutor().execute(() -> BackupUtil.backup(this)); - } else if (actionSource == addProfileButton) { - controller.addProfile(JOptionPane.showInputDialog("Profile name: ")); - updateProfiles(); - } else if (actionSource == deleteProfileButton) { - deleteProfile(); - } else if (actionSource == profiles) { - changeProfile(); - } - } - - /** - * Deletes the selected profile - */ - private void deleteProfile() { - Object selected = profiles.getSelectedItem(); - if (selected != null) { - controller.removeProfile(selected.toString()); - updateProfiles(); } } @@ -413,42 +338,9 @@ public class ServerLauncherGUI extends MessageHandler implements ActionListener, */ public void updateGUIElementsWhenServersStartOrStop(boolean running) { boolean stopped = !running; //Most gui is only enabled when the server is stopped rather than running. - profiles.setEnabled(stopped); - addProfileButton.setEnabled(stopped); - deleteProfileButton.setEnabled(stopped); - startServerButton.setEnabled(stopped); - addServerButton.setEnabled(stopped); - tabbedPane.setEnabledAt(2, stopped); - stopServerButton.setEnabled(running); - } - - /** - * Saves the previous profile and loads data from the new profile - */ - private void changeProfile() { - controller.saveState(); - Object current = this.profiles.getSelectedItem(); - if (current != null) { - controller.setCurrentProfile(current.toString()); - } - this.updateWithSavedProfileData(); - controller.getCurrentProfile().updateConsoles(); - } - - /** - * Stops all servers - */ - public void stopServers() { - try { - setStatus("Servers are stopping..."); - ServerHandler.stop(); - } catch (IOException e1) { - showError("Could not stop server."); - e1.printStackTrace(); - } catch (InterruptedException e) { - showError("Could not kill server."); - e.printStackTrace(); - } + //mainTabbedPane.setEnabledAt(1, !stopped); + mainTabbedPane.setEnabledAt(2, stopped); + controlPanelTab.updateGUIElementsWhenServersStartOrStop(running); } /** diff --git a/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherMenu.java b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherMenu.java index 7213c17..2bf3abc 100644 --- a/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherMenu.java +++ b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/ServerLauncherMenu.java @@ -237,7 +237,7 @@ public class ServerLauncherMenu implements ActionListener { * Asks the user for a delay if checked, and sets the value to the current profile */ private void delay() { - String selectedProfile = serverLauncherGUI.getSelectedProfile(); + String selectedProfile = serverLauncherGUI.getControlPanelTab().getSelectedProfile(); if (selectedProfile != null) { Profile profile = controller.getProfileByName(selectedProfile); if (delayStartupCheckBoxMenuItem.isSelected()) { @@ -260,7 +260,7 @@ public class ServerLauncherMenu implements ActionListener { * Saves the runInBackground setting to the current profile */ private void background() { - String selectedProfile = serverLauncherGUI.getSelectedProfile(); + String selectedProfile = serverLauncherGUI.getControlPanelTab().getSelectedProfile(); if (selectedProfile != null) { Profile profile = controller.getProfileByName(selectedProfile); Objects.requireNonNull(profile).setRunInBackground(runInBackgroundCheckBoxMenuItem.isSelected()); @@ -273,7 +273,7 @@ public class ServerLauncherMenu implements ActionListener { * Saves the downloadJars setting to the current profile */ private void downloadJars() { - String selectedProfile = serverLauncherGUI.getSelectedProfile(); + String selectedProfile = serverLauncherGUI.getControlPanelTab().getSelectedProfile(); if (selectedProfile != null) { controller.setDownloadAllJars(downloadJarsCheckBoxMenuItem.isSelected()); } else { diff --git a/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/Tray.java b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/Tray.java index 7f274b4..7f691bf 100644 --- a/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/Tray.java +++ b/src/main/java/net/knarcraft/minecraftserverlauncher/userinterface/Tray.java @@ -59,7 +59,7 @@ public class Tray { trayIcon = new TrayIcon(trayImage, "Minecraft Server Launcher", popup); trayIcon.setImageAutoSize(true); ActionListener exitListener = e -> { - serverLauncherGUI.stopServers(); + serverLauncherGUI.getControlPanelTab().stopServers(); controller.saveState(); System.exit(0); }; @@ -92,7 +92,7 @@ public class Tray { e1.printStackTrace(); } } else { - serverLauncherGUI.stopServers(); + serverLauncherGUI.getControlPanelTab().stopServers(); controller.saveState(); System.exit(0); } @@ -114,7 +114,7 @@ public class Tray { @Override public void windowClosing(WindowEvent e) { controller.saveState(); - serverLauncherGUI.stopServers(); + serverLauncherGUI.getControlPanelTab().stopServers(); System.exit(0); } });