diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 62e943ee1..4bca4e672 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -2,42 +2,33 @@ import java.awt.Dimension; import java.awt.Toolkit; +import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; -import javax.swing.JDesktopPane; -import javax.swing.JFrame; -import javax.swing.JInternalFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.*; import log.Logger; -/** - * Что требуется сделать: - * 1. Метод создания меню перегружен функционалом и трудно читается. - * Следует разделить его на серию более простых методов (или вообще выделить отдельный класс). - * - */ +import java.beans.PropertyVetoException; +import java.io.*; +import java.util.Properties; + public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - + public MainApplicationFrame() { //Make the big window be indented 50 pixels from each edge //of the screen. - int inset = 50; + int inset = 50; Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setBounds(inset, inset, screenSize.width - inset*2, screenSize.height - inset*2); setContentPane(desktopPane); - - + + LogWindow logWindow = createLogWindow(); addWindow(logWindow); @@ -47,8 +38,9 @@ public MainApplicationFrame() { setJMenuBar(generateMenuBar()); setDefaultCloseOperation(EXIT_ON_CLOSE); + WindowStateManager.loadWindowStateFromFile(desktopPane); } - + protected LogWindow createLogWindow() { LogWindow logWindow = new LogWindow(Logger.getDefaultLogSource()); @@ -59,51 +51,22 @@ protected LogWindow createLogWindow() Logger.debug("Протокол работает"); return logWindow; } - + protected void addWindow(JInternalFrame frame) { desktopPane.add(frame); frame.setVisible(true); } - -// protected JMenuBar createMenuBar() { -// JMenuBar menuBar = new JMenuBar(); -// -// //Set up the lone menu. -// JMenu menu = new JMenu("Document"); -// menu.setMnemonic(KeyEvent.VK_D); -// menuBar.add(menu); -// -// //Set up the first menu item. -// JMenuItem menuItem = new JMenuItem("New"); -// menuItem.setMnemonic(KeyEvent.VK_N); -// menuItem.setAccelerator(KeyStroke.getKeyStroke( -// KeyEvent.VK_N, ActionEvent.ALT_MASK)); -// menuItem.setActionCommand("new"); -//// menuItem.addActionListener(this); -// menu.add(menuItem); -// -// //Set up the second menu item. -// menuItem = new JMenuItem("Quit"); -// menuItem.setMnemonic(KeyEvent.VK_Q); -// menuItem.setAccelerator(KeyStroke.getKeyStroke( -// KeyEvent.VK_Q, ActionEvent.ALT_MASK)); -// menuItem.setActionCommand("quit"); -//// menuItem.addActionListener(this); -// menu.add(menuItem); -// -// return menuBar; -// } - + private JMenuBar generateMenuBar() { JMenuBar menuBar = new JMenuBar(); - + JMenu lookAndFeelMenu = new JMenu("Режим отображения"); lookAndFeelMenu.setMnemonic(KeyEvent.VK_V); lookAndFeelMenu.getAccessibleContext().setAccessibleDescription( "Управление режимом отображения приложения"); - + { JMenuItem systemLookAndFeel = new JMenuItem("Системная схема", KeyEvent.VK_S); systemLookAndFeel.addActionListener((event) -> { @@ -126,7 +89,7 @@ private JMenuBar generateMenuBar() testMenu.setMnemonic(KeyEvent.VK_T); testMenu.getAccessibleContext().setAccessibleDescription( "Тестовые команды"); - + { JMenuItem addLogMessageItem = new JMenuItem("Сообщение в лог", KeyEvent.VK_S); addLogMessageItem.addActionListener((event) -> { @@ -134,12 +97,27 @@ private JMenuBar generateMenuBar() }); testMenu.add(addLogMessageItem); } + JMenuItem exitItem = new JMenuItem("Выход", KeyEvent.VK_E); + exitItem.addActionListener((event) -> { + WindowStateManager.saveWindowStateToFile(desktopPane); + UIManager.put("OptionPane.yesButtonText", "Да");; + UIManager.put("OptionPane.noButtonText", "Нет"); + UIManager.put("OptionPane.cancelButtonText", "Извиняюсь!"); + int result = JOptionPane.showConfirmDialog(this, "Вы уверены, что хотите выйти из приложения?", "Выход", + JOptionPane.YES_NO_CANCEL_OPTION); + + if (result == JOptionPane.YES_OPTION) { + System.exit(0); + } + }); + menuBar.add(lookAndFeelMenu); menuBar.add(testMenu); + menuBar.add(exitItem); return menuBar; } - + private void setLookAndFeel(String className) { try diff --git a/robots/src/gui/WindowStateManager.java b/robots/src/gui/WindowStateManager.java new file mode 100644 index 000000000..821512db0 --- /dev/null +++ b/robots/src/gui/WindowStateManager.java @@ -0,0 +1,58 @@ +package gui; + +import javax.swing.*; +import java.beans.PropertyVetoException; +import java.io.*; +import java.util.Properties; + +public class WindowStateManager { + private static final String PROPERTIES_FILE = "windowState.properties"; + + static void saveWindowStateToFile(JDesktopPane desktopPane) { + Properties prop = new Properties(); + for (JInternalFrame frame : desktopPane.getAllFrames()) { + saveFrameState(frame, prop); + } + + try (FileOutputStream fos = new FileOutputStream(PROPERTIES_FILE)) { + prop.store(fos, "Window States"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + static void loadWindowStateFromFile(JDesktopPane desktopPane) { + Properties prop = new Properties(); + try (FileInputStream fis = new FileInputStream(PROPERTIES_FILE)) { + prop.load(fis); + for (JInternalFrame frame : desktopPane.getAllFrames()) { + restoreFrameState(frame,prop); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + private static void restoreFrameState(JInternalFrame frame, Properties prop) { + int x = Integer.parseInt(prop.getProperty(frame.getTitle() + ".x", "0")); + int y = Integer.parseInt(prop.getProperty(frame.getTitle() + ".y", "0")); + int width = Integer.parseInt(prop.getProperty(frame.getTitle() + ".width", "0")); + int height = Integer.parseInt(prop.getProperty(frame.getTitle() + ".height", "0")); + boolean isIcon = Boolean.parseBoolean(prop.getProperty(frame.getTitle() + ".isIcon", "false")); + + frame.setBounds(x, y, width, height); + try { + if (isIcon) { + frame.setIcon(true); + } + } catch (PropertyVetoException e) { + e.printStackTrace(); + } + } + private static void saveFrameState(JInternalFrame frame, Properties prop) { + prop.setProperty(frame.getTitle() + ".x", String.valueOf(frame.getX())); + prop.setProperty(frame.getTitle() + ".y", String.valueOf(frame.getY())); + prop.setProperty(frame.getTitle() + ".width", String.valueOf(frame.getWidth())); + prop.setProperty(frame.getTitle() + ".height", String.valueOf(frame.getHeight())); + prop.setProperty(frame.getTitle() + ".isIcon", String.valueOf(frame.isIcon())); + } +}