adding some files

This commit is contained in:
ZakenChannel 2024-04-23 12:46:50 +04:00
parent 038c844c37
commit 2cdbfa66e5
11 changed files with 435 additions and 54 deletions

View File

@ -293,7 +293,7 @@ public class FormWarPlaneCollection extends Application implements Initializable
canvasWarPlane = (Canvas) loader.getNamespace().get("canvasWarPlane");
comboBox = (ComboBox<String>) loader.getNamespace().get("comboBox");
comboBox.getItems().addAll("Хранилище");
Scene scene = new Scene(root, 1292, 765);
Scene scene = new Scene(root, 1292, 795);
primaryStage.setTitle("Коллекция истребителей");
primaryStage.setScene(scene);
primaryStage.show();

View File

@ -9,8 +9,9 @@ public interface ICollectionGenericObjects<T> {
/**
* Установка максимального количества элементов
*/
void setMaxCount(int maxCount);
int getMaxCount();
void setMaxCount(int value);
/**
* Добавление объекта в коллекцию
*
@ -43,5 +44,19 @@ public interface ICollectionGenericObjects<T> {
* @return Объект или null, если объекта с такой позицией нет
*/
T get(int position);
/**
* Получение типа коллекции.
*
* @return Тип коллекции.
*/
CollectionType getCollectionType();
/**
* Получение объектов коллекции по одному.
*
* @return Поэлементный вывод элементов коллекции.
*/
Iterable<T> getItems();
}

View File

@ -1,7 +1,9 @@
package com.projectairfighter.collectiongenericobjects;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
public class ListGenericObjects<T> implements ICollectionGenericObjects<T> {
private final List<T> collection;
@ -12,6 +14,11 @@ public class ListGenericObjects<T> implements ICollectionGenericObjects<T> {
return collection.size();
}
@Override
public int getMaxCount() {
return maxCount;
}
@Override
public void setMaxCount(int value) {
if (value > 0) {
@ -32,6 +39,41 @@ public class ListGenericObjects<T> implements ICollectionGenericObjects<T> {
}
}
@Override
public CollectionType getCollectionType() {
return CollectionType.List;
}
/**
* Получение объектов коллекции по одному.
*
* @return Поэлементный вывод элементов коллекции.
*/
@Override
public Iterable<T> getItems() {
return () -> new Iterator<T>() {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < collection.size();
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return collection.get(currentIndex++);
}
@Override
public void remove() {
throw new UnsupportedOperationException("Оператор не поддерживается");
}
};
}
@Override
public int insert(T obj) {
if (getCount() == maxCount) {

View File

@ -12,15 +12,26 @@ public class MassiveGenericObjects<T> implements ICollectionGenericObjects<T> {
@Override
@SuppressWarnings("unchecked")
public void setMaxCount(int value) {
if (value > 0) {
if (collection.length > 0) {
collection = Arrays.copyOf(collection, value);
} else {
collection = (T[]) new Object[value];
}
}
public int getMaxCount() {
return collection.length;
}
@Override
@SuppressWarnings("unchecked")
public void setMaxCount(int value){
if (value < 0) return;
// Создание нового массива с указанным размером
T[] newCollection = (T[]) new Object[value];
// Копирование элементов из старого массива в новый
// Math.min используется, чтобы избежать ArrayIndexOutOfBoundsException
System.arraycopy(collection, 0, newCollection, 0, Math.min(collection.length, value));
// Присваивание нового массива переменной collection
collection = newCollection;
}
@SuppressWarnings("unchecked")
public MassiveGenericObjects() {
collection = (T[]) new Object[0];

View File

@ -1,18 +1,38 @@
package com.projectairfighter.collectiongenericobjects;
import com.projectairfighter.drawnings.DrawningWarPlane;
import java.io.*;
import java.util.*;
import java.util.regex.Pattern;
/**
* Класс-хранилище коллекций.
*
* @param <T> Тип элементов коллекций.
*/
public class StorageCollection<T> {
public class StorageCollection<T extends DrawningWarPlane> {
/**
* Словарь (хранилище) с коллекциями.
*/
private final Map<String, ICollectionGenericObjects<T>> storages;
/**
* Ключевое слово, с которого должен начинаться файл
*/
private final String collectionKey = "CollectionsStorage";
/**
* Разделитель для записи ключа и значения элемента словаря
*/
private final String separatorForKeyValue = "|";
/**
* Разделитель для записей коллекции данных в файл
*/
private final String separatorItems = ";";
/**
* Возвращение списка названий коллекций.
*
@ -86,4 +106,103 @@ public class StorageCollection<T> {
public T getElement(String name, int index) {
return this.get(name).get(index);
}
/**
* Сохранение информации в файл
*/
public boolean saveData(String filename) {
// Проверяем, не пуста ли коллекция
if (storages.isEmpty()) {
return false;
}
// Удаляем файл, если он существует
File file = new File(filename);
if (file.exists()) {
file.delete();
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
// Записываем ключ коллекции
writer.write(collectionKey);
writer.newLine();
// Итерируемся по коллекциям
for (Map.Entry<String, ICollectionGenericObjects<T>> entry : storages.entrySet()) {
// Пропускаем пустые коллекции
if (entry.getValue().getCount() == 0) {
continue;
}
StringBuilder sb = new StringBuilder();
sb.append(entry.getKey());
sb.append(separatorForKeyValue);
sb.append(entry.getValue().getCollectionType());
sb.append(separatorForKeyValue);
sb.append(entry.getValue().getMaxCount());
sb.append(separatorForKeyValue);
// Сохраняем каждый элемент в коллекции
for (T item : entry.getValue().getItems()) {
if (item == null) continue; // Проверка на null
String data = item.getDataForSave();
if (data == null || data.isEmpty()) continue;
sb.append(data);
sb.append(separatorItems);
}
writer.write(sb.toString());
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* Загрузка информации из файла
*/
public boolean loadData(String filename) {
if (!new File(filename).exists()) return false;
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String str = reader.readLine();
if (!collectionKey.equals(str)) return false;
storages.clear();
while ((str = reader.readLine()) != null) {
String[] record = str.split(Pattern.quote(separatorForKeyValue));
if (record.length != 4) continue;
CollectionType collectionType = CollectionType.valueOf(record[1]);
ICollectionGenericObjects<T> collection = createCollection(collectionType);
if (collection == null) return false;
collection.setMaxCount(Integer.parseInt(record[2]));
String[] items = record[3].split(Pattern.quote(separatorItems));
for (String item : items) {
T plane = item.createDrawingPlane(); // Нужна соответствующая реализация
if (plane != null && collection.insert(plane) == -1) return false;
}
storages.put(record[0], collection);
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* Создание коллекции по типу
*/
private ICollectionGenericObjects<T> createCollection(CollectionType collectionType) {
switch (collectionType) {
case Massive:
return new MassiveGenericObjects<>();
case List:
return new ListGenericObjects<>();
default:
return null;
}
}
}

View File

@ -1,6 +1,7 @@
package com.projectairfighter.drawnings;
import com.projectairfighter.entities.EntityAirFighter;
import com.projectairfighter.entities.EntityWarPlane;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
@ -11,10 +12,15 @@ public class DrawningAirFighter extends DrawningWarPlane {
entityWarPlane = new EntityAirFighter(speed, weight, bodyColor, additionalColor, bodyRockets, additionalWings);
}
public DrawningAirFighter(EntityAirFighter entityAirFighter, IDrawableExtras engineDrawing){
public DrawningAirFighter(EntityAirFighter entityAirFighter, IDrawableExtras engineDrawing) {
super(entityAirFighter, engineDrawing);
}
public DrawningAirFighter(EntityWarPlane entityWarPlane) {
super();
this.entityWarPlane = entityWarPlane;
}
// Прорисовка объекта
@Override
public void drawTransport(GraphicsContext gc) {

View File

@ -1,5 +1,6 @@
package com.projectairfighter.drawnings;
import com.projectairfighter.entities.EntityAirFighter;
import com.projectairfighter.entities.EntityWarPlane;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;
@ -68,6 +69,12 @@ public class DrawningWarPlane {
this.engineDrawing = engineDrawing;
}
public DrawningWarPlane(EntityWarPlane entityWarPlane)
{
super();
this.entityWarPlane = entityWarPlane;
}
public boolean setPictureSize(int width, int height) {
if (width <= drawningAirFighterWidth || height <= drawningAirFighterHeight) return false;
pictureWidth = width;
@ -166,4 +173,29 @@ public class DrawningWarPlane {
new double[]{startPosY + 79, startPosY + 133, startPosY + 133, startPosY + 79}, 4);
}
private static final String SEPARATOR_FOR_OBJECT = ":";
/**
* Создание объекта из строки.
*
* @param info Строка с данными для создания объекта.
* @return Объект.
*/
public static DrawningWarPlane createDrawingPlane(String info) {
String[] strs = info.split(SEPARATOR_FOR_OBJECT);
EntityWarPlane plane = EntityAirFighter.createEntityAirFighter(strs);
if (plane != null) {
return new DrawningAirFighter(plane);
}
plane = EntityWarPlane.createEntityWarPlane(strs);
if (plane != null) {
return new DrawningWarPlane(plane);
}
return null;
}
public abstract String getDataForSave();
}

View File

@ -0,0 +1,44 @@
package com.projectairfighter.drawnings;
import com.projectairfighter.entities.EntityAirFighter;
import com.projectairfighter.entities.EntityWarPlane;
public class ExtensionDrawningPlane {
private static final String SEPARATOR_FOR_OBJECT = ":";
/**
* Создание объекта из строки.
*
* @param info Строка с данными для создания объекта.
* @return Объект.
*/
public static DrawningWarPlane createDrawingPlane(String info) {
String[] strs = info.split(SEPARATOR_FOR_OBJECT);
EntityWarPlane plane = EntityAirFighter.createEntityAirFighter(strs);
if (plane != null) {
return new DrawningAirFighter(plane);
}
plane = EntityWarPlane.createEntityWarPlane(strs);
if (plane != null) {
return new DrawningWarPlane(plane);
}
return null;
}
/**
* Получение данных для сохранения в файл.
*
* @param drawningWarPlane Сохраняемый объект.
* @return Строка с данными по объекту.
*/
public static String getDataForSave(DrawningWarPlane drawningWarPlane) {
if (drawningWarPlane == null || drawningWarPlane.entityWarPlane == null) {
return "";
}
String[] array = drawningWarPlane.entityWarPlane.getStringRepresentation();
return String.join(SEPARATOR_FOR_OBJECT, array);
}
}

View File

@ -41,4 +41,38 @@ public class EntityAirFighter extends EntityWarPlane {
this.bodyRockets = bodyRockets;
this.additionalWings = additionalWings;
}
/**
* Получение строк со значениями свойств объекта класса-сущности
*/
@Override
public String[] getStringRepresentation() {
return new String[] {
"EntityAirFighter",
String.valueOf(getSpeed()),
String.valueOf(getWeight()),
getBodyColor().toString(), // Здесь предполагается, что у вас есть метод toString, возвращающий имя цвета
getAdditionalColor().toString(), // Аналогично для дополнительного цвета
String.valueOf(hasBodyRockets()),
String.valueOf(hasAdditionalWings())
};
}
/**
* Создание объекта из массива строк
*/
public static EntityAirFighter createEntityAirFighter(String[] strs) {
if (strs.length != 7 || !"EntityAirFighter".equals(strs[0])) {
return null;
}
int speed = Integer.parseInt(strs[1]);
double weight = Double.parseDouble(strs[2]);
Color bodyColor = Color.valueOf(strs[3]); // Здесь предполагается, что Color.valueOf может обработать имя цвета
Color additionalColor = Color.valueOf(strs[4]);
boolean bodyRockets = Boolean.parseBoolean(strs[5]);
boolean additionalWings = Boolean.parseBoolean(strs[6]);
return new EntityAirFighter(speed, weight, bodyColor, additionalColor, bodyRockets, additionalWings);
}
}

View File

@ -35,4 +35,32 @@ public class EntityWarPlane {
this.weight = weight;
this.bodyColor = bodyColor;
}
/**
* Получение строк со значениями свойств объекта класса-сущности.
*/
public String[] getStringRepresentation() {
return new String[] {
"EntityWarPlane",
String.valueOf(speed),
String.valueOf(weight),
getBodyColor().toString()
};
}
/**
* Создание объекта из массива строк.
* @param strs Массив строк с данными для создания объекта.
* @return Объект класса EntityWarPlane или null, если строка недействительна.
*/
public static EntityWarPlane createEntityWarPlane(String[] strs) {
if (strs.length != 4 || !strs[0].equals("EntityWarPlane")) {
return null;
}
int speed = Integer.parseInt(strs[1]);
double weight = Double.parseDouble(strs[2]);
Color bodyColor = Color.valueOf(strs[3]); // Должен быть реализован метод valueOf для Color
return new EntityWarPlane(speed, weight, bodyColor);
}
}

View File

@ -1,47 +1,97 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.canvas.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.canvas.Canvas?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.RadioButton?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.ToggleGroup?>
<?import javafx.scene.input.KeyCodeCombination?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Text?>
<SplitPane dividerPositions="0.811965811965812" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="765.0" prefWidth="1292.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.projectairfighter.FormWarPlaneCollection">
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="698.0" prefWidth="965.0">
<Canvas fx:id="canvasWarPlane" height="763.0" width="1044.0" />
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="196.0">
<SplitPane dividerPositions="0.43889618922470436" orientation="VERTICAL" prefHeight="763.0" prefWidth="237.0">
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Инструменты" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="6.0" />
<TextField fx:id="textFieldCollectionName" layoutX="6.0" layoutY="49.0" prefHeight="25.0" prefWidth="224.0" />
<RadioButton fx:id="radioButtonMassive" layoutX="25.0" layoutY="77.0" mnemonicParsing="false" text="Массив">
<toggleGroup>
<ToggleGroup fx:id="toggle" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="radioButtonList" layoutX="141.0" layoutY="77.0" mnemonicParsing="false" text="Список" toggleGroup="$toggle" />
<Button layoutX="6.0" layoutY="101.0" mnemonicParsing="false" onAction="#buttonCollectionAdd" prefHeight="25.0" prefWidth="224.0" text="Добавить в коллекцию" />
<Button layoutX="6.0" layoutY="299.0" mnemonicParsing="false" onAction="#buttonCollectionDel" prefHeight="25.0" prefWidth="224.0" text="Удалить коллекцию" />
<ListView fx:id="listViewCollection" layoutX="6.0" layoutY="136.0" prefHeight="155.0" prefWidth="224.0" />
<Label layoutX="56.0" layoutY="26.0" text="Название коллекции" />
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="795.0" prefWidth="1292.0" xmlns="http://javafx.com/javafx/19.0.2" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.projectairfighter.FormWarPlaneCollection">
<children>
<SplitPane dividerPositions="0.811965811965812" layoutX="1.0" layoutY="27.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="765.0" prefWidth="1292.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="698.0" prefWidth="965.0">
<children>
<Canvas fx:id="canvasWarPlane" height="763.0" width="1044.0" />
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
<SplitPane fx:id="splitPane" dividerPositions="0.18691588785046728" layoutY="-8.0" orientation="VERTICAL" prefHeight="430.0" prefWidth="237.0">
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="116.0" prefWidth="235.0">
<ComboBox fx:id="comboBox" layoutX="6.0" layoutY="15.0" onAction="#comboBoxSelectorCompany" prefHeight="25.0" prefWidth="224.0" />
<Button layoutX="6.0" layoutY="46.0" mnemonicParsing="false" onAction="#buttonCreateCompany" prefHeight="25.0" prefWidth="224.0" text="Создать компанию" />
</AnchorPane>
<AnchorPane disable="true" minHeight="0.0" minWidth="0.0" prefHeight="312.0" prefWidth="235.0">
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="5.0" layoutY="12.0" mnemonicParsing="false" onAction="#buttonGoToFormCreate" prefHeight="35.0" prefWidth="224.0" text="Добавление самолета" />
<TextField fx:id="textBox" layoutX="6.0" layoutY="132.0" prefHeight="25.0" prefWidth="224.0" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="162.0" mnemonicParsing="false" onAction="#buttonRemovePlaneClicked" prefHeight="35.0" prefWidth="224.0" text="Удалить истребитель" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="215.0" mnemonicParsing="false" onAction="#buttonGoToCheck" prefHeight="35.0" prefWidth="224.0" text="Передать на тесты" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="300.0" mnemonicParsing="false" onAction="#buttonRefresh" prefHeight="35.0" prefWidth="224.0" text="Обновить" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="90.0" mnemonicParsing="false" onAction="#buttonGoFormConstructor" prefHeight="35.0" prefWidth="224.0" text="Добавить через конструктор" />
<Button layoutX="6.0" layoutY="257.0" mnemonicParsing="false" onAction="#buttonGoToFormWithDeleteObject" prefHeight="35.0" text="Передать на тесты удаленный объект" />
</AnchorPane>
</SplitPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="196.0">
<children>
<SplitPane dividerPositions="0.43889618922470436" orientation="VERTICAL" prefHeight="763.0" prefWidth="237.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
<children>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Инструменты" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="6.0" />
<TextField fx:id="textFieldCollectionName" layoutX="6.0" layoutY="49.0" prefHeight="25.0" prefWidth="224.0" />
<RadioButton fx:id="radioButtonMassive" layoutX="25.0" layoutY="77.0" mnemonicParsing="false" text="Массив">
<toggleGroup>
<ToggleGroup fx:id="toggle" />
</toggleGroup>
</RadioButton>
<RadioButton fx:id="radioButtonList" layoutX="141.0" layoutY="77.0" mnemonicParsing="false" text="Список" toggleGroup="$toggle" />
<Button layoutX="6.0" layoutY="101.0" mnemonicParsing="false" onAction="#buttonCollectionAdd" prefHeight="25.0" prefWidth="224.0" text="Добавить в коллекцию" />
<Button layoutX="6.0" layoutY="299.0" mnemonicParsing="false" onAction="#buttonCollectionDel" prefHeight="25.0" prefWidth="224.0" text="Удалить коллекцию" />
<ListView fx:id="listViewCollection" layoutX="6.0" layoutY="136.0" prefHeight="155.0" prefWidth="224.0" />
<Label layoutX="56.0" layoutY="26.0" text="Название коллекции" />
</children>
</AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
<children>
<SplitPane fx:id="splitPane" dividerPositions="0.18691588785046728" layoutY="-8.0" orientation="VERTICAL" prefHeight="430.0" prefWidth="237.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="116.0" prefWidth="235.0">
<children>
<ComboBox fx:id="comboBox" layoutX="6.0" layoutY="15.0" onAction="#comboBoxSelectorCompany" prefHeight="25.0" prefWidth="224.0" />
<Button layoutX="6.0" layoutY="46.0" mnemonicParsing="false" onAction="#buttonCreateCompany" prefHeight="25.0" prefWidth="224.0" text="Создать компанию" />
</children>
</AnchorPane>
<AnchorPane disable="true" minHeight="0.0" minWidth="0.0" prefHeight="312.0" prefWidth="235.0">
<children>
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="5.0" layoutY="12.0" mnemonicParsing="false" onAction="#buttonGoToFormCreate" prefHeight="35.0" prefWidth="224.0" text="Добавление самолета" />
<TextField fx:id="textBox" layoutX="6.0" layoutY="132.0" prefHeight="25.0" prefWidth="224.0" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="162.0" mnemonicParsing="false" onAction="#buttonRemovePlaneClicked" prefHeight="35.0" prefWidth="224.0" text="Удалить истребитель" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="215.0" mnemonicParsing="false" onAction="#buttonGoToCheck" prefHeight="35.0" prefWidth="224.0" text="Передать на тесты" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="300.0" mnemonicParsing="false" onAction="#buttonRefresh" prefHeight="35.0" prefWidth="224.0" text="Обновить" />
<Button alignment="CENTER" contentDisplay="CENTER" layoutX="6.0" layoutY="90.0" mnemonicParsing="false" onAction="#buttonGoFormConstructor" prefHeight="35.0" prefWidth="224.0" text="Добавить через конструктор" />
<Button layoutX="6.0" layoutY="257.0" mnemonicParsing="false" onAction="#buttonGoToFormWithDeleteObject" prefHeight="35.0" text="Передать на тесты удаленный объект" />
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</AnchorPane>
</items>
</SplitPane>
</children>
</AnchorPane>
</SplitPane>
</AnchorPane>
</SplitPane>
</items>
</SplitPane>
<MenuBar prefHeight="25.0" prefWidth="1292.0">
<menus>
<Menu mnemonicParsing="false" text="Файл">
<items>
<MenuItem mnemonicParsing="false" text="Сохранить">
<accelerator>
<KeyCodeCombination alt="UP" code="S" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator></MenuItem>
<MenuItem mnemonicParsing="false" text="Загрузить">
<accelerator>
<KeyCodeCombination alt="UP" code="L" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator>
</MenuItem>
</items>
</Menu>
</menus>
</MenuBar>
</children>
</AnchorPane>