Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mikhun s patch 2 #74

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 33 additions & 55 deletions robots/src/gui/MainApplicationFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -47,8 +38,9 @@ public MainApplicationFrame() {

setJMenuBar(generateMenuBar());
setDefaultCloseOperation(EXIT_ON_CLOSE);
WindowStateManager.loadWindowStateFromFile(desktopPane);
}

protected LogWindow createLogWindow()
{
LogWindow logWindow = new LogWindow(Logger.getDefaultLogSource());
Expand All @@ -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) -> {
Expand All @@ -126,20 +89,35 @@ private JMenuBar generateMenuBar()
testMenu.setMnemonic(KeyEvent.VK_T);
testMenu.getAccessibleContext().setAccessibleDescription(
"Тестовые команды");

{
JMenuItem addLogMessageItem = new JMenuItem("Сообщение в лог", KeyEvent.VK_S);
addLogMessageItem.addActionListener((event) -> {
Logger.debug("Новая строка");
});
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
Expand Down
58 changes: 58 additions & 0 deletions robots/src/gui/WindowStateManager.java
Original file line number Diff line number Diff line change
@@ -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()));
}
}