From b2b5b048f351f1c923bc7ffecbe3433ca5a17d50 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Tue, 3 Mar 2026 10:04:24 +0500 Subject: [PATCH 1/2] first task first try --- robots/src/gui/Listener.java | 8 ++ robots/src/gui/MainApplicationFrame.java | 110 +++++++++++++++-------- robots/src/gui/RobotsProgram.java | 6 ++ robots/src/log/LogWindowSource.java | 13 ++- 4 files changed, 93 insertions(+), 44 deletions(-) create mode 100644 robots/src/gui/Listener.java 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(); } From 8c7ef2b8127ef954a0262797653b455dedfba876 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 15 May 2026 13:59:23 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=201,2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 3 + .idea/Robots.iml | 11 ++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/misc.xml | 6 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ .../Robots/gui/GameVisualizer$1.class | Bin 0 -> 605 bytes .../Robots/gui/GameVisualizer$2.class | Bin 0 -> 610 bytes .../Robots/gui/GameVisualizer$3.class | Bin 0 -> 833 bytes .../Robots/gui/GameVisualizer.class | Bin 0 -> 5627 bytes out/production/Robots/gui/GameWindow.class | Bin 0 -> 856 bytes out/production/Robots/gui/Listener.class | Bin 0 -> 269 bytes out/production/Robots/gui/LogWindow.class | Bin 0 -> 2580 bytes .../Robots/gui/MainApplicationFrame$1.class | Bin 0 -> 737 bytes .../Robots/gui/MainApplicationFrame.class | Bin 0 -> 10400 bytes out/production/Robots/gui/RobotsProgram.class | Bin 0 -> 1904 bytes .../Robots/log/LogChangeListener.class | Bin 0 -> 148 bytes out/production/Robots/log/LogEntry.class | Bin 0 -> 651 bytes out/production/Robots/log/LogLevel.class | Bin 0 -> 1390 bytes .../Robots/log/LogWindowSource.class | Bin 0 -> 2586 bytes out/production/Robots/log/Logger.class | Bin 0 -> 857 bytes robots/src/gui/MainApplicationFrame.java | 98 +++++++++++++++++- robots/src/log/Logger.java | 2 +- 23 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/Robots.iml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 out/production/Robots/gui/GameVisualizer$1.class create mode 100644 out/production/Robots/gui/GameVisualizer$2.class create mode 100644 out/production/Robots/gui/GameVisualizer$3.class create mode 100644 out/production/Robots/gui/GameVisualizer.class create mode 100644 out/production/Robots/gui/GameWindow.class create mode 100644 out/production/Robots/gui/Listener.class create mode 100644 out/production/Robots/gui/LogWindow.class create mode 100644 out/production/Robots/gui/MainApplicationFrame$1.class create mode 100644 out/production/Robots/gui/MainApplicationFrame.class create mode 100644 out/production/Robots/gui/RobotsProgram.class create mode 100644 out/production/Robots/log/LogChangeListener.class create mode 100644 out/production/Robots/log/LogEntry.class create mode 100644 out/production/Robots/log/LogLevel.class create mode 100644 out/production/Robots/log/LogWindowSource.class create mode 100644 out/production/Robots/log/Logger.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/Robots.iml b/.idea/Robots.iml new file mode 100644 index 0000000..8df936b --- /dev/null +++ b/.idea/Robots.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8b92ee8 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..650a132 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/out/production/Robots/gui/GameVisualizer$1.class b/out/production/Robots/gui/GameVisualizer$1.class new file mode 100644 index 0000000000000000000000000000000000000000..4fb9850b92ad39e55d776047d7cdcac3b1501924 GIT binary patch literal 605 zcmZuuO-my|5Pg-5nPi;km}vZ3bq|5nC}zFv#U&t;U4Xb0M`qABMeS)`}3?*T*r?foGMyKw|)0i{0UNR7I zUl`@$m!#)mL41&Y5Og0^DYNTyEWh?ofRd4RWD% l_}IvWT?O-Aggq>9RKOxWF?#%e6)feM2`n=P%y!S^^&j^Gcqjk> literal 0 HcmV?d00001 diff --git a/out/production/Robots/gui/GameVisualizer$2.class b/out/production/Robots/gui/GameVisualizer$2.class new file mode 100644 index 0000000000000000000000000000000000000000..ba3bd499f051ebe02aac669c4da957d6086f04aa GIT binary patch literal 610 zcmZuuO;6iE5Ph4NI57rHLiuQc_K*Vvi6Dx40U;s8N2P!&0l6>93KpC-^4c6Y@t2Sa zNImoi^hZ^^HAo1-N}e|}e)D!__TT?Me*tXaYYiooeRv^;P!X6o%XNEC4pdj$T*mrF zrOj1=N_MVobA|sq?+NPxs;K!0LJT7mXk5r^+0HW^w~zHerN`1hDFFOw2*jSMkYJUuJ6OTA55>YT=^>7P|u8Hpv2G9c|QMJ~(yvp2p17 zJ4sK*U72bZza%|3kig^zYR%Pkf#^VG=SlyUOu36prR0{=+z13mNuKu9u6ELmx0_ma zgR_Ml(~A?U&DpbvK=n}BY(KFaApB{JO1EQat+M#W?N|8_B8uGp>6Q2mqfTtl+a$V7 z&|12OXg$KeD>xIh6$sikKG9A-vxrlS$S>3crs)rnb{mmAgOJwA{vf*IYU?+|14dp& ogF@&#e5@71u7bQ5VGo}fmGA|#M30YH!(5RW#XK<}+qKK{1S%zZHUIzs literal 0 HcmV?d00001 diff --git a/out/production/Robots/gui/GameVisualizer$3.class b/out/production/Robots/gui/GameVisualizer$3.class new file mode 100644 index 0000000000000000000000000000000000000000..9eca8376fc13be88195d913aa857b1b0c0ef5bbd GIT binary patch literal 833 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 literal 0 HcmV?d00001 diff --git a/out/production/Robots/gui/GameWindow.class b/out/production/Robots/gui/GameWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..dcdd94327d3407594d09b764d2206c4d5928bf98 GIT binary patch literal 856 zcmZuvU2oD*7=8|86lw*Az`k^Dib{*Fe($1-iIU7{x@j`QGH=WQ8tg1BDP^cvUiuUK z8-4(ZB=g>@`iG3~88AomB<(rxInVn(&-?N7_xB?J53vzPgke7X6n_2nAv_Ad(AQfH zf6z7zdorS!l@L=PAOaJs_@ zwHx>ZHeS+FD-vXeOrvA#kIAKCw>#Xi-&?+n1Qfw>mSLu-RuV`dEn!YU2Im-(6OTRH zt$SStrTOac#F-&$P5^&H8WM8EH6{2tcP&T4JVWkSAnykHBhRl}zRBNtoj^t&ii|9l zgqCH7<#8qgID%|*mp3fmP%CjPdv)SZnZ&o#X;v-&1+O}ElQF#-cPiYsg+0EE2CwZlL;9o- zqedAFvn^3`(V~AlLC^B8*YRuCmMuc3#88Yp*997Dq$^5ON~~fKj!#TX3Eixd^${^d zXy4Q_EJ|yD8EuHf{s3osNDh(RA0kiI!T^hAN&ALm=6oM3S|686eO%q6L+La5N1)Sx ug(8Du%Sa+e%mt*0Weyv}Z4moSdd-jca0|D|DqsP3aF^6D+#@@J`+oqG+SXtI literal 0 HcmV?d00001 diff --git a/out/production/Robots/gui/Listener.class b/out/production/Robots/gui/Listener.class new file mode 100644 index 0000000000000000000000000000000000000000..223493f0380e613367d13963eda52e3778cacfcd GIT binary patch literal 269 zcmYk0L2kk@5Jmrlgg_b!V$Fsf?E)VFgoKc~in=L+wILRr3Y;o9a4uGry5ImD3U!P? zsx7_o|Mrak<@$RDFhwUpfLe?&MT9z`_oWY7>7!HTV60P1ws~=!=K9;2l29MBWj7(z z1}}>k4MMu9SY^C-#`*{0tjG>1M@RZx^~`ukU8)K6y`g&i)S> z5t5IhD%a+XeP`=2edx2Hk60r6MY1KduqjI2G!VW1fKFlrNQC~{^GTTA&XLrXDEU_y Gp#2BC);EU$ literal 0 HcmV?d00001 diff --git a/out/production/Robots/gui/LogWindow.class b/out/production/Robots/gui/LogWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..d6304ed88946bc2e846275b18a37a9589bdef0c7 GIT binary patch literal 2580 zcma)8S##4?6#i~DIf}>zA%rCjyX^!FU1?2eh=CGt!jd#;0xeZy;fOerE6WL?8>M^c zzHc*q>}#1RP9ZZ)r%#H)BaV zJ!)DhdrqKX=3K^357~KVlJ?q?Tr6+<;<$=tv?yrRuo`OwRkudAAIQ z(8EP@i7DbTiaYVhh=R2OEgocj&W#Nl7u|!7p@*_~FOh5)XsrnHN!>Cs3U<EG8L&@DY}I3yiHj44YHrs2pldo|pR zduT&Xr34~nClmHe*0!h^FH7r*i3`T0OFJqfbf1R%@qj>M+HeEz61KqFaAY|Gaz{6r z42IxAJft8lUG5JE$0W#-ia>Nl1Qq6ruq1>78Xl1$sLAS+(^7CyL!T5h=d&r@HCSZ< zG6jbO+W%RgeR(s(n5sx1B1`O14M)*0!;#69@$gEzpCQvHGDf@s$B|SppkWXviaaV* z1VX0Nc5RkmDH?g#%)~q^l+(&7oK`TTVHl4UtyHM6P^R?UAnVf0@whxOs^M{rk+9{7 z*Aye|xev0V;0#ML=#ayf>&&Yd#}gW!#5n<#*%~l%ITnOK<@um#Wi)gR6PRSF=-I4c zu{3tA)C6Uf;hzoS84rQRg(@wjHB3prA=mbGWG7tEFfCh4c7kj?DVxz?$<(Q)HLGV# znZ8y|tgMEo!7x@kc}rk>I9V}0;z4P6{7>gC%gc}o7kLG<8s>13{a9+D!?P^tQ+Xp# zcn$PpPa8@4q51Z5ekDV)H!raVgJ4$95P@~2>Eh3_U|2;)n4pB6qLZd1OMfswGhsNx z5*ibov?ukm*%lID&m|aq~^@C9g7ps zOFcJ~$>Lz@_|JrKDi68rp#eP`K+$-YrARcI&fkH|IKf zcEE6_>{PB9(WYATHr3%h74PE%1s`ho2p3p_)QU$eKM!4eO@O;)NSO5Q;zRNqGEicNza)J|Oh(m$- z(E2To!$d~U<&2zy&sf#}ipfg!6nr7jd1qC2tRD+(<}|E<%^fSR3%?m{H>;3 z!85!+%hivlqXak`Z51{AETB5teI51D?|2o^6kSBySZn(NI<8|Qg&SM&Q;YbmfUZSs z8(YMVu?2(|&^^#2H(PfXu!qO)?I~d2C?6i?)qBnJ{v7YS(ZG8f(XB-j+WB3__fQA+ zVgq`y5y!9zL&P~sq-W5D=c(Q0FsqlD4n!Qnc7(B$ufQ+cBextumHdD`sAtS%bTnTx@KKF7DXYR&ycO)dOAK%0 R9bTVMqEh=)^8XSYe*;pAta1PV literal 0 HcmV?d00001 diff --git a/out/production/Robots/gui/MainApplicationFrame$1.class b/out/production/Robots/gui/MainApplicationFrame$1.class new file mode 100644 index 0000000000000000000000000000000000000000..27fe8e2e5f3b450fced7a1588b7a96092f8df7d6 GIT binary patch literal 737 zcmaJfgc5Ph4vvE#U{DdnRjrGRosgGAbMP(>7_0x2zsqHx|iOS{NfNA{-S$X}{d zK;pm;;71|eCKYgKICy4u^ybaH8UOtC{Re;!o>Wl6k`FJ!GRgv5XA|8zlG=2}<5VZo z>dYMGa-{0}0%d!yi~1f>{Y9{LhyWEIVT39of!arTAzN~4Tk1j?+j_6fFq?LUa%@#j z#^>5-dmymX*d2se#hQ;e!Yx;Ne^C#CYLb}`Iv@2uX)CbZSUk?|K)~x}LnW}**G3&r zMyD!&Cr?vm*85o^(}B#jdtWC#Cz69Nz%R&$Hnh>2^aYtXP@Ov~|<0(B@2F zr_sMre9tYS?FJK^q4qzJKzNc(@iPEU&OIHI-?T5D%R<5GdiGmnXviv3q@6J*5 z_xK`y#>T@jUMB2wOzlYfYVKg0nZpvGzs+pI6) WA$I6J{w@`YahX*-rVp<>F#HYcG^7#$ literal 0 HcmV?d00001 diff --git a/out/production/Robots/gui/MainApplicationFrame.class b/out/production/Robots/gui/MainApplicationFrame.class new file mode 100644 index 0000000000000000000000000000000000000000..b597b5d29642d260b52eecdf178ed3837efa0ffe GIT binary patch literal 10400 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 literal 0 HcmV?d00001 diff --git a/out/production/Robots/log/LogEntry.class b/out/production/Robots/log/LogEntry.class new file mode 100644 index 0000000000000000000000000000000000000000..59e3960a0d34053d5dd3a789acff074e7a1a3c25 GIT binary patch literal 651 zcmZuuT}#4X6n@@0ozAJtwC_*4(G~3n7(ql`t-3ITu4LNFn#>KhDfF)jlAw!zKtC!v zdmU*SgY&iXJkL4j{rdj+1aN_U6%sNEWDQy581#WXwoT9W9rLa?;Qg2(cjo$Te9n+* zG&=?4QBa_2C_-b9!0jp8LHNdtsRH1@3azpSwjUngF5UI z+~Q;IF_f*8O5`nuqsHILGFP+1AYTTLq*Sq7pWlv#Js#fMJx^!{ecS8Up_}AsQI4P7 zXiiIvO9>oZEB6?@(hHfo^%JDIu^E2+rcR8^J_Pmsbr;>I!*3^L%M}T zuOQJ!2N4lnm3#(_o@0ewC9`vGfIc!mG~ literal 0 HcmV?d00001 diff --git a/out/production/Robots/log/LogLevel.class b/out/production/Robots/log/LogLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..15d09c013a3a8b48e2d6e2f4901adb0e5dbb9e5b GIT binary patch literal 1390 zcmZuwU2_v<6n@_9XO_2Z8fdXluol!LC=mq}Q)^3UB^tz;t#vY7INPvq=f7`*SJB1G&($N zO&P*L!5Lc96(oVl|BlAHs42K>NtO)O6&9ycO(NU%J(;(maRu*@z=IzWL%4!!`)~sK znv&-Og|n{lN7cuIgnXj$DQ*f`W{yLJ`C9#dbg{8xr@fUwAX9UlB#XZp z9_+`(ZnU4$vih2m^^>eCR6BVuO8257k)TPWoka&sP<@pvh05J{@F;)qZB!65hzqu7 z4<02H?(y*DFzIK}U|2ARUE`44XDWxNVAbkv61CP#C$!Q)_sUcyS;5-LHrHDUL6{GV zUc8gYXfwyBeN}e9agD64@cR9YCAo5dlBaAW57Mr9x z!%gOEQCp>yCm3Pz51f0B^S@A2SmUp2d=~MS@Hz7c{yL>Z1Xa~|hBu!>3BGg!zfOxD zqwobbsBQ9f81|z;c`UF@vOAPEUAl2)`6=FRT=*UJU#XAN&C(0`Gopf1n1`fYq)(FH zGNZ}Y7KgJ;ff>Rp^vcWUHs2Dq*~bpPy1zeyZ#8L!&j;FaR=>5zMr^AdG7zk zY}NNI>nW~2fn~I7wrw=eXdgO`(E_7=V9Iz#JBH|gm?O;)k8 zahq*cNu|n77Frd+#EPbLk*fTX{Df30rTOmdo(D=Ll}b_cy?r0&eCIpgIX%BU`{@yY zvna$+gOG->jtHUxP1lTdV=!mf*})6T*UXG35ItqtmNzC4N+jp&P>VVZF&*{L1zK`W zb};Q^7c6_lxiRY$-Ha))E5Br2Dw;(zZQ5CHRX|K>*u~Szc+sM4}BY=KB(YRac&O2>J;%U}w{WobZC!aYBn zidp)dwX(M16nLh4)e*L%UO+Vju1$z`81kk<14?<;GAq^+|#(mzRKqXzM0Ab z(ABdA(G%Z**7Fbzi}5WqZlGDsx3G5uZTFSgi+t|ob)cOWJ5YyxbP}iO{kWv|B&aUD zhgpttHb-!5^>`oify=K5HO#%vo*&S*IQ>Kpy_?v#&?7c*upOp3@9JY_%GOG};#$F8@h1 z0w4YxzQg|&Uy}HGiLa0N`iXDgf8qNGNuNJ4LAH99n^b!b204S_GC;_ma`WrjvDt#Wda8J4;6Gc=?mIfNLFqXj3Z zgOkKR%+J&a|3=xDQ_RX~csPU4Iex((9Wr|-s4b7Y$((62#&RBS<6|t50l9V+20h1c z6U)fZqs;9fB7Y&Nq5C0LUmj%}_gwn*U2?;&fv^r<@S{tfHXBmw{c literal 0 HcmV?d00001 diff --git a/out/production/Robots/log/Logger.class b/out/production/Robots/log/Logger.class new file mode 100644 index 0000000000000000000000000000000000000000..0386159b2b40270ec73abc71d2503c2cce6e0afb GIT binary patch literal 857 zcmZ`%+iuf96r4?*+Hp*pUeZD-*K%<}X@vTOQXwG<5|W`0ML|4n;>EZ!cI7zbw@Q(y z1QH*>N1@Kz4p18WVDB04nKLuHKYxAu0pKaNY*bJ+VK}H^PM~!lk7O^BanRcv9;i_! zFt-!NVfI9z>UIWoSg4z@9W>ww*ijPnyd(%z%3fc+my;-Cy`N0dkrHTo<%YLm>?fZJ zxL-#T^Cnsj7O*JblzTjNq#}XZt{P4Pf#$R~$NM&x(KfN-U=^1ImSzxBt2{hZu`jUU zp6~Yl_}b6XFb?|KOA~7ju4)an=V_Xxdd4-K#B~9~ec2iC^DOacWZny7^?LGgsM0rb z7!g_Yl97xCG7WWIf=2cs9MjQsICJTf+%Fup-B~i2;y6oRsqt6_IqwCjWKdcjT?Z=L zy^!*%+nEkLm$QJiGm6U7vy1Rwgj#%qXGCpVdK4bR(0IL-ICxjs`VC!2zcek5mm1S}$(#4C7s2FZ1xmH+?% literal 0 HcmV?d00001 diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java index f3b18e7..2756f06 100644 --- a/robots/src/gui/MainApplicationFrame.java +++ b/robots/src/gui/MainApplicationFrame.java @@ -5,9 +5,22 @@ import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; +import java.beans.PropertyVetoException; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; -import javax.swing.*; +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.JOptionPane; import log.Logger; @@ -21,12 +34,17 @@ public class MainApplicationFrame extends JFrame { private final JDesktopPane desktopPane = new JDesktopPane(); + private final LogWindow logWindowGlobal; + private final GameWindow gameWindowGlobal; + private static final String WINDOW_STATE_FILE = System.getProperty("user.home") + "\\window_state.properties"; + private void confirmExit() { int result = JOptionPane.showConfirmDialog(this, "Вы действительно хотите выйти?", "Подтверждение выхода", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { + saveWindowStates(); dispose(); System.exit(0); } @@ -45,12 +63,16 @@ public MainApplicationFrame() { LogWindow logWindow = createLogWindow(); + logWindowGlobal = logWindow; addWindow(logWindow); GameWindow gameWindow = new GameWindow(); + gameWindowGlobal = gameWindow; gameWindow.setSize(400, 400); addWindow(gameWindow); + loadWindowStates(); + setJMenuBar(generateMenuBar()); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { @@ -77,7 +99,77 @@ protected void addWindow(JInternalFrame frame) desktopPane.add(frame); frame.setVisible(true); } - + + private void saveWindowStates() { + Properties props = new Properties(); + + props.setProperty("frame.x", String.valueOf(getX())); + props.setProperty("frame.y", String.valueOf(getY())); + props.setProperty("frame.width", String.valueOf(getWidth())); + props.setProperty("frame.height", String.valueOf(getHeight())); + props.setProperty("frame.extendedState", String.valueOf(getExtendedState())); + + saveInternalFrameState(props, logWindowGlobal, "LogWindow"); + saveInternalFrameState(props, gameWindowGlobal, "GameWindow"); + + try (FileOutputStream out = new FileOutputStream(WINDOW_STATE_FILE)) { + props.store(out, "Window states"); + } catch (IOException e) { + System.err.println("Не удалось сохранить состояние окон: " + e.getMessage()); + } + } + + private void saveInternalFrameState(Properties props, JInternalFrame frame, String prefix) { + props.setProperty(prefix + ".x", String.valueOf(frame.getX())); + props.setProperty(prefix + ".y", String.valueOf(frame.getY())); + props.setProperty(prefix + ".width", String.valueOf(frame.getWidth())); + props.setProperty(prefix + ".height", String.valueOf(frame.getHeight())); + props.setProperty(prefix + ".isIcon", String.valueOf(frame.isIcon())); + props.setProperty(prefix + ".isMaximum", String.valueOf(frame.isMaximum())); + } + + private void loadWindowStates() { + Properties props = new Properties(); + try (FileInputStream in = new FileInputStream(WINDOW_STATE_FILE)) { + props.load(in); + } catch (IOException e) { + return; + } + + try { + int x = Integer.parseInt(props.getProperty("frame.x")); + int y = Integer.parseInt(props.getProperty("frame.y")); + int width = Integer.parseInt(props.getProperty("frame.width")); + int height = Integer.parseInt(props.getProperty("frame.height")); + setBounds(x, y, width, height); + int extendedState = Integer.parseInt(props.getProperty("frame.extendedState")); + setExtendedState(extendedState); + } catch (NumberFormatException e) {} + + loadInternalFrameState(props, logWindowGlobal, "LogWindow"); + loadInternalFrameState(props, gameWindowGlobal, "GameWindow"); + } + + + private void loadInternalFrameState(Properties props, JInternalFrame frame, String prefix) { + try { + int x = Integer.parseInt(props.getProperty(prefix + ".x")); + int y = Integer.parseInt(props.getProperty(prefix + ".y")); + int width = Integer.parseInt(props.getProperty(prefix + ".width")); + int height = Integer.parseInt(props.getProperty(prefix + ".height")); + boolean isIcon = Boolean.parseBoolean(props.getProperty(prefix + ".isIcon")); + boolean isMaximum = Boolean.parseBoolean(props.getProperty(prefix + ".isMaximum")); + + // Сначала устанавливаем границы, потом развёрнутость/свёрнутость + frame.setBounds(x, y, width, height); + if (isMaximum) { + frame.setMaximum(true); + } else { + frame.setIcon(isIcon); + } + } catch (NumberFormatException | PropertyVetoException e) {} + } + // protected JMenuBar createMenuBar() { // JMenuBar menuBar = new JMenuBar(); // diff --git a/robots/src/log/Logger.java b/robots/src/log/Logger.java index b008a5d..91c71b6 100644 --- a/robots/src/log/Logger.java +++ b/robots/src/log/Logger.java @@ -4,7 +4,7 @@ public final class Logger { private static final LogWindowSource defaultLogSource; static { - defaultLogSource = new LogWindowSource(100); + defaultLogSource = new LogWindowSource(5); } private Logger()