diff --git a/robots/src/gui/Listener.java b/robots/src/gui/Listener.java new file mode 100644 index 0000000..647cd84 --- /dev/null +++ b/robots/src/gui/Listener.java @@ -0,0 +1,8 @@ +package gui; + +import java.awt.event.WindowAdapter; +import java.awt.event.WindowListener; + +public class Listener extends WindowAdapter { + +} diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index 62e943e..f3b18e7 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -3,16 +3,11 @@ import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; -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; @@ -25,7 +20,18 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); - + + private void confirmExit() { + int result = JOptionPane.showConfirmDialog(this, + "Вы действительно хотите выйти?", + "Подтверждение выхода", + JOptionPane.YES_NO_OPTION); + if (result == JOptionPane.YES_OPTION) { + dispose(); + System.exit(0); + } + } + public MainApplicationFrame() { //Make the big window be indented 50 pixels from each edge //of the screen. @@ -46,7 +52,13 @@ public MainApplicationFrame() { addWindow(gameWindow); setJMenuBar(generateMenuBar()); - setDefaultCloseOperation(EXIT_ON_CLOSE); + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e){ + confirmExit(); + } + }); } protected LogWindow createLogWindow() @@ -68,12 +80,12 @@ protected void addWindow(JInternalFrame frame) // 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); @@ -82,7 +94,7 @@ protected void addWindow(JInternalFrame frame) // menuItem.setActionCommand("new"); //// menuItem.addActionListener(this); // menu.add(menuItem); -// +// // //Set up the second menu item. // menuItem = new JMenuItem("Quit"); // menuItem.setMnemonic(KeyEvent.VK_Q); @@ -91,52 +103,78 @@ protected void addWindow(JInternalFrame frame) // menuItem.setActionCommand("quit"); //// menuItem.addActionListener(this); // menu.add(menuItem); -// +// // return menuBar; // } - - private JMenuBar generateMenuBar() + + private void addSystemLookAndFeel(JMenu lookAndFeelMenu) { - 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) -> { setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); this.invalidate(); }); lookAndFeelMenu.add(systemLookAndFeel); - } + } - { + private void addCrossplatformLookAndFeel(JMenu lookAndFeelMenu) + { JMenuItem crossplatformLookAndFeel = new JMenuItem("Универсальная схема", KeyEvent.VK_S); crossplatformLookAndFeel.addActionListener((event) -> { setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); this.invalidate(); }); lookAndFeelMenu.add(crossplatformLookAndFeel); - } + } + + private void addLogMessageItem(JMenu testMenu) + { + JMenuItem addLogMessageItem = new JMenuItem("Сообщение в лог", KeyEvent.VK_S); + addLogMessageItem.addActionListener((event) -> { + Logger.debug("Новая строка"); + }); + testMenu.add(addLogMessageItem); + } + + private void addExitLookAndFeel(JMenu exitMenu) + { + JMenuItem addLogMessageItem = new JMenuItem("Завершение работы программы", KeyEvent.VK_S); + addLogMessageItem.addActionListener((event) -> { + confirmExit(); + }); + exitMenu.add(addLogMessageItem); + } + + private JMenuBar generateMenuBar() + { + JMenuBar menuBar = new JMenuBar(); + + JMenu lookAndFeelMenu = new JMenu("Режим отображения"); + lookAndFeelMenu.setMnemonic(KeyEvent.VK_V); + lookAndFeelMenu.getAccessibleContext().setAccessibleDescription( + "Управление режимом отображения приложения"); + + addSystemLookAndFeel(lookAndFeelMenu); + + addCrossplatformLookAndFeel(lookAndFeelMenu); JMenu testMenu = new JMenu("Тесты"); testMenu.setMnemonic(KeyEvent.VK_T); testMenu.getAccessibleContext().setAccessibleDescription( "Тестовые команды"); - - { - JMenuItem addLogMessageItem = new JMenuItem("Сообщение в лог", KeyEvent.VK_S); - addLogMessageItem.addActionListener((event) -> { - Logger.debug("Новая строка"); - }); - testMenu.add(addLogMessageItem); - } + + addLogMessageItem(testMenu); + + JMenu exitMenu = new JMenu("Выход"); + exitMenu.setMnemonic(KeyEvent.VK_T); + exitMenu.getAccessibleContext().setAccessibleDescription( + "Меню выхода"); + + addExitLookAndFeel(exitMenu); menuBar.add(lookAndFeelMenu); menuBar.add(testMenu); + menuBar.add(exitMenu); return menuBar; } diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java index ae0930a..a8800b1 100644 --- a/robots/src/gui/RobotsProgram.java +++ b/robots/src/gui/RobotsProgram.java @@ -1,6 +1,7 @@ package gui; import java.awt.Frame; +import java.util.Locale; import javax.swing.SwingUtilities; import javax.swing.UIManager; @@ -8,6 +9,11 @@ public class RobotsProgram { public static void main(String[] args) { + UIManager.put("OptionPane.yesButtonText", "Да"); + UIManager.put("OptionPane.noButtonText", "Нет"); + UIManager.put("OptionPane.okButtonText", "OK"); + UIManager.put("OptionPane.cancelButtonText", "Отмена"); + UIManager.put("OptionPane.titleText", "Подтверждение"); try { UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); // UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); diff --git a/robots/src/log/LogWindowSource.java b/robots/src/log/LogWindowSource.java index ca0ce44..5e3a4ac 100644 --- a/robots/src/log/LogWindowSource.java +++ b/robots/src/log/LogWindowSource.java @@ -49,19 +49,16 @@ public void append(LogLevel logLevel, String strMessage) { LogEntry entry = new LogEntry(logLevel, strMessage); m_messages.add(entry); - LogChangeListener [] activeListeners = m_activeListeners; - if (activeListeners == null) + if(m_messages.size() > m_iQueueLength) + m_messages.removeFirst(); + if (m_activeListeners == null) { synchronized (m_listeners) { - if (m_activeListeners == null) - { - activeListeners = m_listeners.toArray(new LogChangeListener [0]); - m_activeListeners = activeListeners; - } + m_activeListeners = m_listeners.toArray(new LogChangeListener [0]); } } - for (LogChangeListener listener : activeListeners) + for (LogChangeListener listener : m_activeListeners) { listener.onLogChanged(); }