TODO xmls
This commit is contained in:
parent
09cac4779e
commit
3235141828
@ -4,6 +4,7 @@ import javafx.fxml.FXML;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.ColorPicker;
|
||||
import javafx.scene.control.ComboBox;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.FlowPane;
|
||||
@ -41,16 +42,27 @@ public class ControllerBoat {
|
||||
private Button buttonUp;
|
||||
@FXML
|
||||
private Button buttonDown;
|
||||
@FXML
|
||||
private Button buttonSelectBoat;
|
||||
@FXML
|
||||
private ColorPicker bodyColorPicker;
|
||||
@FXML
|
||||
private ColorPicker dopColorPicker;
|
||||
private final double rootPadding = 10.0;
|
||||
private DrawningBoat _boat;
|
||||
private boolean bodyColorPickerChanged = false;
|
||||
private boolean dopColorPickerChanged = false;
|
||||
public DrawningBoat GetSelectedBoat()
|
||||
{
|
||||
return _boat;
|
||||
}
|
||||
@FXML
|
||||
public void initialize() {
|
||||
buttonCreate.setTranslateX(rootPadding);
|
||||
|
||||
root.widthProperty().addListener((obs, oldVal, newVal) -> {
|
||||
UpdateGUI();
|
||||
if (_boat != null)
|
||||
{
|
||||
if (_boat != null) {
|
||||
_boat.ChangeBorders((int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
}
|
||||
Draw();
|
||||
@ -66,6 +78,9 @@ public class ControllerBoat {
|
||||
@FXML
|
||||
void ButtonCreate_Click() {
|
||||
Random rnd = new Random();
|
||||
if (!bodyColorPickerChanged) {
|
||||
bodyColorPicker.setValue(Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
}
|
||||
_boat = new DrawningBoat(rnd.nextInt(200) + 100, rnd.nextInt(1000) + 1000,
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
SetData();
|
||||
@ -74,6 +89,12 @@ public class ControllerBoat {
|
||||
@FXML
|
||||
void ButtonCreateModif_Click() {
|
||||
Random rnd = new Random();
|
||||
if (!bodyColorPickerChanged) {
|
||||
bodyColorPicker.setValue(Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
}
|
||||
if (!dopColorPickerChanged) {
|
||||
dopColorPicker.setValue(Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
}
|
||||
_boat = new DrawningSpeedboat(rnd.nextInt(200) + 100, rnd.nextInt(1000) + 1000,
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)),
|
||||
@ -96,27 +117,37 @@ public class ControllerBoat {
|
||||
Draw();
|
||||
}
|
||||
@FXML
|
||||
private void ComboBoxOrnamentType_Changed() {
|
||||
private void ComboBoxType_Changed() {
|
||||
if (_boat != null) {
|
||||
ChangeDrawningOars();
|
||||
Draw();
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void ComboBoxNumOfRollers_Changed() {
|
||||
private void ComboBoxNumOars_Changed() {
|
||||
if (_boat != null) {
|
||||
_boat.GetDrawningOars().SetNumberOars(Integer.parseInt(comboBoxNumOars.getValue()));
|
||||
Draw();
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void BodyColorPicker_Changed()
|
||||
{
|
||||
bodyColorPickerChanged = true;
|
||||
}
|
||||
@FXML
|
||||
private void DopColorPicker_Changed()
|
||||
{
|
||||
dopColorPickerChanged = true;
|
||||
}
|
||||
private void ChangeDrawningOars() {
|
||||
if (_boat != null) {
|
||||
IDrawningAdditionalElement newDrawningOars = switch (comboBoxOarsType.getValue()) {
|
||||
case "None" -> new DrawningOars(_boat.GetBoat().GetBodyColor());
|
||||
case "Slim" -> new DrawningSlimOars(_boat.GetBoat().GetBodyColor());
|
||||
case "Large" -> new DrawningLargeOars(_boat.GetBoat().GetBodyColor());
|
||||
default -> null;
|
||||
};
|
||||
case "None" -> new DrawningOars(_boat.GetBoat().GetBodyColor());
|
||||
case "Slim" -> new DrawningSlimOars(_boat.GetBoat().GetBodyColor());
|
||||
case "Large" -> new DrawningLargeOars(_boat.GetBoat().GetBodyColor());
|
||||
default -> null;
|
||||
};
|
||||
if (newDrawningOars != null) {
|
||||
_boat.SetDrawningOars(newDrawningOars);
|
||||
_boat.GetDrawningOars().SetNumberOars(Integer.parseInt(comboBoxNumOars.getValue()));
|
||||
@ -153,17 +184,14 @@ public class ControllerBoat {
|
||||
|
||||
buttonRight.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonRight.setTranslateX(rootWidth - rootPadding - buttonMoveSize);
|
||||
|
||||
buttonSelectBoat.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
buttonSelectBoat.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 3.0 -
|
||||
distanceBetweenButtons * 3.0 - buttonSelectBoat.getWidth());
|
||||
}
|
||||
private void Draw() {
|
||||
GraphicsContext gc = canvas.getGraphicsContext2D();
|
||||
|
||||
gc.clearRect(0.0, 0.0, canvas.getWidth(), canvas.getHeight());
|
||||
gc.setFill(Color.WHITE);
|
||||
gc.fillRect(0.0, 0.0, canvas.getWidth(), canvas.getHeight());
|
||||
|
||||
gc.setStroke(Color.BLACK);
|
||||
gc.setLineWidth(4);
|
||||
gc.strokeRect(0.0, 0.0, canvas.getWidth(), canvas.getHeight());
|
||||
|
||||
if (_boat != null) {
|
||||
_boat.DrawTransport(gc);
|
||||
@ -176,6 +204,5 @@ public class ControllerBoat {
|
||||
(int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
labelSpeedValue.setText(Integer.toString(_boat.GetBoat().GetSpeed()));
|
||||
labelWeightValue.setText(Double.toString(_boat.GetBoat().GetWeight()));
|
||||
labelBodyColorValue.setText(_boat.GetBoat().GetBodyColor().toString());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,360 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.FlowPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Stack;
|
||||
|
||||
public class ControllerMapWithSetBoats {
|
||||
@FXML
|
||||
private Pane root;
|
||||
@FXML
|
||||
private Canvas canvas;
|
||||
@FXML
|
||||
private Pane paneRight;
|
||||
@FXML
|
||||
private ComboBox<String> comboBoxSelectorMap;
|
||||
@FXML
|
||||
private TextField textFieldPosition;
|
||||
@FXML
|
||||
private TextField textFieldNewMapName;
|
||||
@FXML
|
||||
private Button buttonLeft;
|
||||
@FXML
|
||||
private Button buttonRight;
|
||||
@FXML
|
||||
private Button buttonUp;
|
||||
@FXML
|
||||
private Button buttonDown;
|
||||
@FXML
|
||||
private ListView<String> listViewMaps;
|
||||
private final HashMap<String, AbstractMap> _mapsDict = new HashMap<String, AbstractMap>();
|
||||
private MapsCollection _mapsCollection;
|
||||
private Stack<DrawningBoat> _removedBoats;
|
||||
public void SetMapsCollection(MapsCollection mapsCollection)
|
||||
{
|
||||
_mapsCollection = mapsCollection;
|
||||
}
|
||||
@FXML
|
||||
public void initialize() {
|
||||
_mapsDict.put("Simple map", new SimpleMap());
|
||||
_mapsDict.put("My second map", new MySecondMap());
|
||||
|
||||
_mapsCollection = new MapsCollection((int) canvas.getWidth(), (int) canvas.getHeight(), canvas.getGraphicsContext2D());
|
||||
comboBoxSelectorMap.getItems().clear();
|
||||
for (Map.Entry<String, AbstractMap> map : _mapsDict.entrySet()) {
|
||||
comboBoxSelectorMap.getItems().add(map.getKey());
|
||||
}
|
||||
|
||||
_removedBoats = new Stack<>();
|
||||
|
||||
textFieldPosition.textProperty().addListener((ov, oldValue, newValue) -> {
|
||||
if (Objects.equals(newValue, "")) {
|
||||
return;
|
||||
}
|
||||
if (newValue.length() > 2) {
|
||||
String s = newValue.substring(0, 2);
|
||||
textFieldPosition.setText(s);
|
||||
}
|
||||
if (!newValue.matches("[0-9]+")) {
|
||||
textFieldPosition.setText(oldValue);
|
||||
}
|
||||
});
|
||||
|
||||
root.widthProperty().addListener((obs, oldVal, newVal) -> {
|
||||
UpdateGUI();
|
||||
});
|
||||
|
||||
root.heightProperty().addListener((obs, oldVal, newVal) -> {
|
||||
UpdateGUI();
|
||||
});
|
||||
|
||||
listViewMaps.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
|
||||
String selectedMapName = listViewMaps.getSelectionModel().getSelectedItem();
|
||||
if (selectedMapName != null) {
|
||||
_mapsCollection.Get(selectedMapName).ShowSet();
|
||||
}
|
||||
});
|
||||
}
|
||||
@FXML
|
||||
public void ButtonAddBoat_Click() throws IOException {
|
||||
if (listViewMaps.getSelectionModel().getSelectedItem() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Stage stageBoat = new Stage();
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(FormBoat.class.getResource("form-boat-view.fxml"));
|
||||
Scene sceneBoat = new Scene(fxmlLoader.load(), 320, 240);
|
||||
|
||||
FirstUpdateBoatGUI(sceneBoat, stageBoat, fxmlLoader, false);
|
||||
|
||||
stageBoat.setTitle("Boat");
|
||||
stageBoat.setScene(sceneBoat);
|
||||
stageBoat.show();
|
||||
}
|
||||
@FXML
|
||||
private void ButtonRemoveBoat_Click() {
|
||||
if (listViewMaps.getSelectionModel().getSelectedIndex() == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
String stringPosition = textFieldPosition.getText();
|
||||
if (stringPosition == null || stringPosition.length() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Alert removeAlert = new Alert(Alert.AlertType.CONFIRMATION, "Remove object?", ButtonType.YES, ButtonType.NO);
|
||||
removeAlert.showAndWait();
|
||||
|
||||
Alert infoAlert;
|
||||
if (removeAlert.getResult() == ButtonType.YES) {
|
||||
String selectedMapName = listViewMaps.getSelectionModel().getSelectedItem();
|
||||
int pos = Integer.parseInt(stringPosition);
|
||||
DrawningObjectBoat removedBoat = _mapsCollection.Get(selectedMapName, pos);
|
||||
if (selectedMapName != null && removedBoat != null) {
|
||||
_mapsCollection.Get(selectedMapName).Delete(pos);
|
||||
infoAlert = new Alert(Alert.AlertType.INFORMATION, "Object removed", ButtonType.OK);
|
||||
_removedBoats.add(removedBoat.GetBoat());
|
||||
_mapsCollection.Get(selectedMapName).ShowSet();
|
||||
}
|
||||
else {
|
||||
infoAlert = new Alert(Alert.AlertType.INFORMATION, "Failed to remove object", ButtonType.OK);
|
||||
}
|
||||
}
|
||||
else {
|
||||
infoAlert = new Alert(Alert.AlertType.INFORMATION, "Remove operation canceled", ButtonType.OK);
|
||||
}
|
||||
infoAlert.showAndWait();
|
||||
}
|
||||
@FXML
|
||||
private void ButtonShowStorage_Click()
|
||||
{
|
||||
if (listViewMaps.getSelectionModel().getSelectedIndex() == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
String selectedMapName = listViewMaps.getSelectionModel().getSelectedItem();
|
||||
if (selectedMapName != null) {
|
||||
_mapsCollection.Get(selectedMapName).ShowSet();
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void ButtonShowOnMap_Click() {
|
||||
if (listViewMaps.getSelectionModel().getSelectedIndex() == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
String selectedMapName = listViewMaps.getSelectionModel().getSelectedItem();
|
||||
if (selectedMapName != null) {
|
||||
_mapsCollection.Get(selectedMapName).ShowOnMap();
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void ButtonMove_Click(ActionEvent event) {
|
||||
if (listViewMaps.getSelectionModel().getSelectedIndex() == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
String buttonName = ((Button) event.getSource()).getId();
|
||||
Direction dir = switch (buttonName) {
|
||||
case "buttonUp" -> Direction.Up;
|
||||
case "buttonDown" -> Direction.Down;
|
||||
case "buttonLeft" -> Direction.Left;
|
||||
case "buttonRight" -> Direction.Right;
|
||||
default -> Direction.None;
|
||||
};
|
||||
|
||||
String selectedMapName = listViewMaps.getSelectionModel().getSelectedItem();
|
||||
if (selectedMapName != null) {
|
||||
_mapsCollection.Get(selectedMapName).MoveObject(dir);
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void ButtonAddMap_Click()
|
||||
{
|
||||
Alert addMapAlert;
|
||||
if (comboBoxSelectorMap.getSelectionModel().getSelectedIndex() == -1 || textFieldNewMapName.getText() == null
|
||||
|| textFieldNewMapName.getText().length() == 0) {
|
||||
addMapAlert = new Alert(Alert.AlertType.ERROR, "Not all information has been entered.", ButtonType.OK);
|
||||
addMapAlert.showAndWait();
|
||||
return;
|
||||
}
|
||||
if (!_mapsDict.containsKey(comboBoxSelectorMap.getValue())) {
|
||||
addMapAlert = new Alert(Alert.AlertType.ERROR, "No such map exists.", ButtonType.OK);
|
||||
addMapAlert.showAndWait();
|
||||
return;
|
||||
}
|
||||
_mapsCollection.AddMap(textFieldNewMapName.getText(), _mapsDict.get(comboBoxSelectorMap.getValue()));
|
||||
ReloadMaps();
|
||||
}
|
||||
@FXML
|
||||
private void ButtonDeleteMap_Click() {
|
||||
if (comboBoxSelectorMap.getSelectionModel().getSelectedIndex() == -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
Alert deleteMapAlert = new Alert(Alert.AlertType.CONFIRMATION, String.format("Delete map %s?",
|
||||
listViewMaps.getSelectionModel().getSelectedItem()), ButtonType.YES, ButtonType.NO);
|
||||
deleteMapAlert.showAndWait();
|
||||
|
||||
String removableMapName = listViewMaps.getSelectionModel().getSelectedItem();
|
||||
if (deleteMapAlert.getResult() == ButtonType.YES && removableMapName != null) {
|
||||
_mapsCollection.DelMap(removableMapName);
|
||||
ReloadMaps();
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void ButtonShowRemovedArmoredVehicle_Click() throws IOException {
|
||||
if (_removedBoats.empty()) {
|
||||
Alert addMapAlert = new Alert(Alert.AlertType.ERROR, "Collection of removed objects is empty.", ButtonType.OK);
|
||||
addMapAlert.showAndWait();
|
||||
}
|
||||
else {
|
||||
Stage stageArmoredVehicle = new Stage();
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(FormBoat.class.getResource("form-removed-armored-boat.fxml"));
|
||||
Scene sceneArmoredVehicle = new Scene(fxmlLoader.load(), 320, 240);
|
||||
|
||||
FirstUpdateBoatGUI(sceneArmoredVehicle, stageArmoredVehicle, fxmlLoader, true);
|
||||
|
||||
stageArmoredVehicle.setTitle("Removed armored vehicle");
|
||||
stageArmoredVehicle.setScene(sceneArmoredVehicle);
|
||||
stageArmoredVehicle.show();
|
||||
|
||||
ControllerRemovedBoat controllerRemovedBoat = fxmlLoader.getController();
|
||||
controllerRemovedBoat.SetBoat(_removedBoats.pop());
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateGUI()
|
||||
{
|
||||
double rootWidth = root.getWidth();
|
||||
double rootHeight = root.getHeight();
|
||||
double rightPaneWidth = paneRight.getWidth();
|
||||
|
||||
canvas.setWidth(rootWidth - rightPaneWidth);
|
||||
canvas.setHeight(rootHeight);
|
||||
|
||||
paneRight.setTranslateX(rootWidth - rightPaneWidth);
|
||||
paneRight.setPrefHeight(rootHeight);
|
||||
|
||||
int _distanceBetweenMoveButtons = 5;
|
||||
double moveButtonsSize = 30.0;
|
||||
double moveButtonsXMargin = (rightPaneWidth - moveButtonsSize * 3.0 - _distanceBetweenMoveButtons * 2.0) / 2.0;
|
||||
|
||||
int rightPaneMargin = 5;
|
||||
buttonUp.setTranslateY(rootHeight - moveButtonsSize * 2.0 - _distanceBetweenMoveButtons - rightPaneMargin);
|
||||
buttonUp.setTranslateX(rootWidth - moveButtonsSize * 2.0 - moveButtonsXMargin - _distanceBetweenMoveButtons);
|
||||
|
||||
buttonDown.setTranslateY(rootHeight - moveButtonsSize - rightPaneMargin);
|
||||
buttonDown.setTranslateX(rootWidth - moveButtonsSize * 2.0 - moveButtonsXMargin - _distanceBetweenMoveButtons);
|
||||
|
||||
buttonLeft.setTranslateY(rootHeight - moveButtonsSize - rightPaneMargin);
|
||||
buttonLeft.setTranslateX(rootWidth - moveButtonsSize * 3.0 - moveButtonsXMargin - _distanceBetweenMoveButtons * 2.0);
|
||||
|
||||
buttonRight.setTranslateY(rootHeight - moveButtonsSize - rightPaneMargin);
|
||||
buttonRight.setTranslateX(rootWidth - moveButtonsSize - moveButtonsXMargin);
|
||||
}
|
||||
|
||||
private void FirstUpdateBoatGUI(Scene scene, Stage stageBoat, FXMLLoader fxmlLoader, boolean formRemovedBoat) {
|
||||
Pane root = (Pane) scene.lookup("#root");
|
||||
Canvas canvas = (Canvas) scene.lookup("#canvas");
|
||||
Button buttonCreate = (Button) scene.lookup("#buttonCreate");
|
||||
Button buttonUp = (Button) scene.lookup("#buttonUp");
|
||||
Button buttonLeft = (Button) scene.lookup("#buttonLeft");
|
||||
Button buttonRight = (Button) scene.lookup("#buttonRight");
|
||||
Button buttonDown = (Button) scene.lookup("#buttonDown");
|
||||
FlowPane flowPane = (FlowPane) scene.lookup("#flowPane");
|
||||
|
||||
root.applyCss();
|
||||
root.layout();
|
||||
|
||||
double flowPaneHeight = flowPane.getHeight();
|
||||
double buttonCreateHeight = buttonCreate.getHeight();
|
||||
double buttonCreateWidth = buttonCreate.getWidth();
|
||||
double rootWidth = root.getWidth();
|
||||
double rootHeight = root.getHeight();
|
||||
double rootPadding = 10.0;
|
||||
double distanceBetweenButtons = 5.0;
|
||||
double buttonMoveSize = 30.0;
|
||||
|
||||
canvas.setWidth(rootWidth);
|
||||
flowPane.setPrefWidth(rootWidth);
|
||||
canvas.setHeight(rootHeight - flowPaneHeight);
|
||||
flowPane.setTranslateY(rootHeight - flowPaneHeight);
|
||||
buttonCreate.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
|
||||
buttonUp.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize * 2.0 - rootPadding -
|
||||
distanceBetweenButtons);
|
||||
buttonUp.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 2.0 - distanceBetweenButtons);
|
||||
|
||||
buttonDown.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonDown.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 2.0 - distanceBetweenButtons);
|
||||
|
||||
buttonLeft.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonLeft.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 3.0 - distanceBetweenButtons * 2.0);
|
||||
|
||||
buttonRight.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonRight.setTranslateX(rootWidth - rootPadding - buttonMoveSize);
|
||||
|
||||
|
||||
if (!formRemovedBoat) {
|
||||
Button buttonCreateModif = (Button) scene.lookup("#buttonCreateModif");
|
||||
Button buttonSelectBoat = (Button) scene.lookup("#buttonSelectArmoredVehicle");
|
||||
buttonCreateModif.setTranslateX(rootPadding + buttonCreateWidth + distanceBetweenButtons);
|
||||
buttonCreateModif.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
|
||||
buttonSelectBoat.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
buttonSelectBoat.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 3.0 -
|
||||
distanceBetweenButtons * 3.0 - buttonSelectBoat.getWidth());
|
||||
|
||||
buttonSelectBoat.setOnAction(e -> {
|
||||
stageBoat.close();
|
||||
ControllerBoat controllerBoat = fxmlLoader.getController();
|
||||
DrawningObjectBoat boat = new DrawningObjectBoat(controllerBoat.GetSelectedBoat());
|
||||
|
||||
String selectedMapName = listViewMaps.getSelectionModel().getSelectedItem();
|
||||
|
||||
Alert alert;
|
||||
if (selectedMapName != null && selectedMapName.length() != 0 && _mapsCollection.Get(selectedMapName).Add(boat) != -1) {
|
||||
alert = new Alert(Alert.AlertType.INFORMATION, "Object added", ButtonType.OK);
|
||||
_mapsCollection.Get(selectedMapName).ShowSet();
|
||||
}
|
||||
else {
|
||||
alert = new Alert(Alert.AlertType.ERROR, "Failed to add object", ButtonType.OK);
|
||||
}
|
||||
alert.showAndWait();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void ReloadMaps()
|
||||
{
|
||||
int index = listViewMaps.getSelectionModel().getSelectedIndex();
|
||||
|
||||
listViewMaps.getItems().clear();
|
||||
for (String key : _mapsCollection.GetKeys())
|
||||
{
|
||||
listViewMaps.getItems().add(key);
|
||||
}
|
||||
|
||||
if (listViewMaps.getItems().size() > 0 && (index == -1 || index >= listViewMaps.getItems().size()))
|
||||
{
|
||||
listViewMaps.getSelectionModel().select(0);
|
||||
}
|
||||
else if (listViewMaps.getItems().size() > 0 && index > -1 && index < listViewMaps.getItems().size())
|
||||
{
|
||||
listViewMaps.getSelectionModel().select(index);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,146 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.ComboBox;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.FlowPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class ControllerRemovedBoat {
|
||||
@FXML
|
||||
private Pane root;
|
||||
@FXML
|
||||
private Canvas canvas;
|
||||
@FXML
|
||||
private FlowPane flowPane;
|
||||
@FXML
|
||||
private Label labelSpeedValue;
|
||||
@FXML
|
||||
private Label labelWeightValue;
|
||||
@FXML
|
||||
private Label labelBodyColorValue;
|
||||
@FXML
|
||||
private ComboBox<String> comboBoxNumOars;
|
||||
@FXML
|
||||
private Button buttonCreate;
|
||||
@FXML
|
||||
private Button buttonLeft;
|
||||
@FXML
|
||||
private Button buttonRight;
|
||||
@FXML
|
||||
private Button buttonUp;
|
||||
@FXML
|
||||
private Button buttonDown;
|
||||
private final double rootPadding = 10.0;
|
||||
private DrawningBoat _boat;
|
||||
public void SetBoat(DrawningBoat boat) {
|
||||
_boat = boat;
|
||||
SetData();
|
||||
Draw();
|
||||
}
|
||||
@FXML
|
||||
public void initialize() {
|
||||
buttonCreate.setTranslateX(rootPadding);
|
||||
|
||||
root.widthProperty().addListener((obs, oldVal, newVal) -> {
|
||||
UpdateGUI();
|
||||
if (_boat != null) {
|
||||
_boat.ChangeBorders((int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
}
|
||||
Draw();
|
||||
});
|
||||
root.heightProperty().addListener((obs, oldVal, newVal) -> {
|
||||
UpdateGUI();
|
||||
if (_boat != null) {
|
||||
_boat.ChangeBorders((int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
}
|
||||
Draw();
|
||||
});
|
||||
}
|
||||
@FXML
|
||||
private void ButtonCreate_Click() {
|
||||
Random rnd = new Random();
|
||||
_boat = new DrawningBoat(rnd.nextInt(200) + 100, rnd.nextInt(1000) + 1000,
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
|
||||
_boat.GetDrawningOars().SetNumberOars(Integer.parseInt(comboBoxNumOars.getValue()));
|
||||
|
||||
SetData();
|
||||
Draw();
|
||||
}
|
||||
@FXML
|
||||
private void ComboBoxNumOars_Changed() {
|
||||
if (_boat != null) {
|
||||
_boat.GetDrawningOars().SetNumberOars(Integer.parseInt(comboBoxNumOars.getValue()));
|
||||
Draw();
|
||||
}
|
||||
}
|
||||
@FXML
|
||||
private void ButtonMove_Click(ActionEvent event) {
|
||||
if (_boat == null) {
|
||||
return;
|
||||
}
|
||||
String buttonName = ((Button)event.getSource()).getId();
|
||||
switch (buttonName) {
|
||||
case "buttonUp" -> _boat.MoveTransport(Direction.Up);
|
||||
case "buttonDown" -> _boat.MoveTransport(Direction.Down);
|
||||
case "buttonLeft" -> _boat.MoveTransport(Direction.Left);
|
||||
case "buttonRight" -> _boat.MoveTransport(Direction.Right);
|
||||
}
|
||||
Draw();
|
||||
}
|
||||
private void SetData() {
|
||||
Random rnd = new Random();
|
||||
_boat.SetPosition(rnd.nextInt(90) + 10, rnd.nextInt(90),
|
||||
(int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
|
||||
labelSpeedValue.setText(Integer.toString(_boat.GetBoat().GetSpeed()));
|
||||
labelWeightValue.setText(Double.toString(_boat.GetBoat().GetWeight()));
|
||||
labelBodyColorValue.setText(_boat.GetBoat().GetBodyColor().toString());
|
||||
}
|
||||
private void UpdateGUI() {
|
||||
double rootWidth = root.getWidth();
|
||||
double rootHeight = root.getHeight();
|
||||
|
||||
double flowPaneHeight = flowPane.getHeight();
|
||||
double buttonCreateHeight = buttonCreate.getHeight();
|
||||
|
||||
canvas.setWidth(rootWidth);
|
||||
flowPane.setPrefWidth(rootWidth);
|
||||
canvas.setHeight(rootHeight - flowPaneHeight);
|
||||
flowPane.setTranslateY(rootHeight - flowPaneHeight);
|
||||
|
||||
buttonCreate.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
|
||||
int buttonMoveSize = 30;
|
||||
int distanceBetweenButtons = 5;
|
||||
buttonUp.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize * 2.0 - rootPadding -
|
||||
distanceBetweenButtons);
|
||||
buttonUp.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 2.0 - distanceBetweenButtons);
|
||||
|
||||
buttonDown.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonDown.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 2.0 - distanceBetweenButtons);
|
||||
|
||||
buttonLeft.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonLeft.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 3.0 -
|
||||
distanceBetweenButtons * 2.0);
|
||||
|
||||
buttonRight.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonRight.setTranslateX(rootWidth - rootPadding - buttonMoveSize);
|
||||
}
|
||||
private void Draw() {
|
||||
GraphicsContext gc = canvas.getGraphicsContext2D();
|
||||
gc.clearRect(0.0, 0.0, canvas.getWidth(), canvas.getHeight());
|
||||
|
||||
if (_boat != null) {
|
||||
_boat.DrawTransport(gc);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,155 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.FlowPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class ControllerSetMixedBoats {
|
||||
@FXML
|
||||
private Pane root;
|
||||
@FXML
|
||||
private Canvas canvas;
|
||||
@FXML
|
||||
private FlowPane flowPane;
|
||||
@FXML
|
||||
private Label labelSpeedValue;
|
||||
@FXML
|
||||
private Label labelWeightValue;
|
||||
@FXML
|
||||
private Label labelBodyColorValue;
|
||||
@FXML
|
||||
private Button buttonCreate;
|
||||
@FXML
|
||||
private Button buttonLeft;
|
||||
@FXML
|
||||
private Button buttonRight;
|
||||
@FXML
|
||||
private Button buttonUp;
|
||||
@FXML
|
||||
private Button buttonDown;
|
||||
private final double rootPadding = 10.0;
|
||||
private DrawningBoat _boat;
|
||||
private SetMixedBoatsGeneric<EntityBoat, IDrawningAdditionalElement> _setMixedBoats;
|
||||
@FXML
|
||||
public void initialize() {
|
||||
_setMixedBoats = new SetMixedBoatsGeneric<>(40, EntityBoat.class, IDrawningAdditionalElement.class);
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
_setMixedBoats.AddBoat(CreateRandomBoat());
|
||||
_setMixedBoats.AddAdditionalElement(CreateRandomAdditionalElement());
|
||||
}
|
||||
|
||||
buttonCreate.setTranslateX(rootPadding);
|
||||
|
||||
root.widthProperty().addListener((obs, oldVal, newVal) -> {
|
||||
UpdateGUI();
|
||||
if (_boat != null) {
|
||||
_boat.ChangeBorders((int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
}
|
||||
Draw();
|
||||
});
|
||||
root.heightProperty().addListener((obs, oldVal, newVal) -> {
|
||||
UpdateGUI();
|
||||
if (_boat != null) {
|
||||
_boat.ChangeBorders((int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
}
|
||||
Draw();
|
||||
});
|
||||
}
|
||||
public EntityBoat CreateRandomBoat() {
|
||||
Random rnd = new Random();
|
||||
return new EntityBoat(rnd.nextInt(200) + 100, rnd.nextInt(1000) + 1000,
|
||||
Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
}
|
||||
public IDrawningAdditionalElement CreateRandomAdditionalElement() {
|
||||
Random rnd = new Random();
|
||||
int oarsType = rnd.nextInt(0, 3);
|
||||
int numOars = rnd.nextInt(4, 7);
|
||||
IDrawningAdditionalElement additionalElement;
|
||||
switch (oarsType) {
|
||||
case 1 ->
|
||||
additionalElement = new DrawningSlimOars(Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
case 2 ->
|
||||
additionalElement = new DrawningLargeOars(Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
default ->
|
||||
additionalElement = new DrawningOars(Color.rgb(rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)));
|
||||
}
|
||||
additionalElement.SetNumberOars(numOars);
|
||||
|
||||
return additionalElement;
|
||||
}
|
||||
@FXML
|
||||
void ButtonCreate_Click() {
|
||||
_boat = _setMixedBoats.GetRandomBoat();
|
||||
SetData();
|
||||
Draw();
|
||||
}
|
||||
@FXML
|
||||
void ButtonMove_Click(ActionEvent event) {
|
||||
if (_boat == null) {
|
||||
return;
|
||||
}
|
||||
String buttonName = ((Button)event.getSource()).getId();
|
||||
switch (buttonName) {
|
||||
case "buttonUp" -> _boat.MoveTransport(Direction.Up);
|
||||
case "buttonDown" -> _boat.MoveTransport(Direction.Down);
|
||||
case "buttonLeft" -> _boat.MoveTransport(Direction.Left);
|
||||
case "buttonRight" -> _boat.MoveTransport(Direction.Right);
|
||||
}
|
||||
Draw();
|
||||
}
|
||||
private void UpdateGUI() {
|
||||
double rootWidth = root.getWidth();
|
||||
double rootHeight = root.getHeight();
|
||||
|
||||
double flowPaneHeight = flowPane.getHeight();
|
||||
double buttonCreateHeight = buttonCreate.getHeight();
|
||||
|
||||
canvas.setWidth(rootWidth);
|
||||
flowPane.setPrefWidth(rootWidth);
|
||||
canvas.setHeight(rootHeight - flowPaneHeight);
|
||||
flowPane.setTranslateY(rootHeight - flowPaneHeight);
|
||||
|
||||
buttonCreate.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
|
||||
int buttonMoveSize = 30;
|
||||
int distanceBetweenButtons = 5;
|
||||
buttonUp.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize * 2.0 - rootPadding -
|
||||
distanceBetweenButtons);
|
||||
buttonUp.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 2.0 - distanceBetweenButtons);
|
||||
|
||||
buttonDown.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonDown.setTranslateX(rootWidth- rootPadding - buttonMoveSize * 2.0 - distanceBetweenButtons);
|
||||
|
||||
buttonLeft.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonLeft.setTranslateX(rootWidth - rootPadding - buttonMoveSize * 3.0 -
|
||||
distanceBetweenButtons * 2.0);
|
||||
|
||||
buttonRight.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize - rootPadding);
|
||||
buttonRight.setTranslateX(rootWidth - rootPadding - buttonMoveSize);
|
||||
}
|
||||
private void Draw() {
|
||||
GraphicsContext gc = canvas.getGraphicsContext2D();
|
||||
gc.clearRect(0.0, 0.0, canvas.getWidth(), canvas.getHeight());
|
||||
if (_boat != null) {
|
||||
_boat.DrawTransport(gc);
|
||||
}
|
||||
}
|
||||
private void SetData()
|
||||
{
|
||||
Random rnd = new Random();
|
||||
_boat.SetPosition(rnd.nextInt(90) + 10, rnd.nextInt(90),
|
||||
(int) canvas.getWidth(), (int) canvas.getHeight());
|
||||
labelSpeedValue.setText(Integer.toString(_boat.GetBoat().GetSpeed()));
|
||||
labelWeightValue.setText(Double.toString(_boat.GetBoat().GetWeight()));
|
||||
labelBodyColorValue.setText(_boat.GetBoat().GetBodyColor().toString());
|
||||
}
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
public enum Direction {
|
||||
None,
|
||||
Up,
|
||||
Down,
|
||||
Left,
|
||||
|
@ -36,6 +36,10 @@ public class DrawningBoat {
|
||||
_boatHeight = boatHeight;
|
||||
_boatWidth = boatWidth;
|
||||
}
|
||||
public DrawningBoat(EntityBoat boat, IDrawningAdditionalElement additionalElement) {
|
||||
_boat = boat;
|
||||
_drawningOars = additionalElement;
|
||||
}
|
||||
public void SetPosition(int x, int y, int width, int height) {
|
||||
if (x < 0 || y < 0) {
|
||||
return;
|
||||
|
@ -4,6 +4,10 @@ import javafx.scene.canvas.GraphicsContext;
|
||||
|
||||
public class DrawningObjectBoat implements IDrawningObject {
|
||||
private DrawningBoat _boat = null;
|
||||
public DrawningBoat GetBoat()
|
||||
{
|
||||
return _boat;
|
||||
}
|
||||
public DrawningObjectBoat(DrawningBoat boat)
|
||||
{
|
||||
_boat = boat;
|
||||
|
@ -0,0 +1,131 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.canvas.Canvas;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.ListView;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class FormMapWithSetBoats extends Application {
|
||||
@Override
|
||||
public void start(Stage stage) throws IOException {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(FormBoat.class.getResource("form-map-with-set-boats-view.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load(), 640, 540);
|
||||
|
||||
FirstUpdateGUI(scene, fxmlLoader);
|
||||
|
||||
stage.setTitle("Map with a set of objects");
|
||||
stage.setScene(scene);
|
||||
|
||||
stage.show();
|
||||
}
|
||||
private void FirstUpdateGUI(Scene scene, FXMLLoader fxmlLoader) {
|
||||
Pane root = (Pane)scene.lookup("#root");
|
||||
Canvas canvas = (Canvas)scene.lookup("#canvas");
|
||||
Pane paneRight = (Pane)scene.lookup("#paneRight");
|
||||
VBox vBoxMaps = (VBox)scene.lookup("#vBoxMaps");
|
||||
Label labelTools = (Label)scene.lookup("#labelTools");
|
||||
@SuppressWarnings("unchecked")
|
||||
ListView<String> listViewMaps = (ListView<String>)scene.lookup("#listViewMaps");
|
||||
Button buttonAddMap = (Button)scene.lookup("#buttonAddMap");
|
||||
Button buttonDeleteMap = (Button)scene.lookup("#buttonDeleteMap");
|
||||
Button buttonAddBoat = (Button)scene.lookup("#buttonAddBoat");
|
||||
TextField textFieldPosition = (TextField)scene.lookup("#textFieldPosition");
|
||||
Button buttonRemoveBoat = (Button)scene.lookup("#buttonRemoveBoat");
|
||||
Button buttonShowRemovedBoat = (Button)scene.lookup("#buttonShowRemovedBoat");
|
||||
Button buttonShowStorage = (Button)scene.lookup("#buttonShowStorage");
|
||||
Button buttonShowOnMap = (Button)scene.lookup("#buttonShowOnMap");
|
||||
Button buttonUp = (Button)scene.lookup("#buttonUp");
|
||||
Button buttonLeft = (Button)scene.lookup("#buttonLeft");
|
||||
Button buttonRight = (Button)scene.lookup("#buttonRight");
|
||||
Button buttonDown = (Button)scene.lookup("#buttonDown");
|
||||
|
||||
root.applyCss();
|
||||
root.layout();
|
||||
|
||||
double paneRightPadding = 5.0;
|
||||
double rootWidth = root.getWidth();
|
||||
double rootHeight = root.getHeight();
|
||||
double standardWidth = buttonRemoveBoat.getWidth() + paneRightPadding * 6;
|
||||
double standardHeight = buttonRemoveBoat.getHeight();
|
||||
double paneRightWidth = standardWidth + paneRightPadding * 2;
|
||||
|
||||
canvas.setWidth(rootWidth - paneRightWidth);
|
||||
canvas.setHeight(rootHeight);
|
||||
ControllerMapWithSetBoats controller = fxmlLoader.getController();
|
||||
controller.SetMapsCollection(new MapsCollection((int)canvas.getWidth(), (int)rootHeight, canvas.getGraphicsContext2D()));
|
||||
|
||||
paneRight.setPrefWidth(paneRightWidth);
|
||||
paneRight.setPrefHeight(rootHeight);
|
||||
paneRight.setTranslateX(rootWidth - paneRightWidth);
|
||||
|
||||
double topMargin = labelTools.getHeight();
|
||||
|
||||
vBoxMaps.setPrefWidth(standardWidth);
|
||||
vBoxMaps.setTranslateX(paneRightPadding);
|
||||
vBoxMaps.setTranslateY(topMargin);
|
||||
topMargin += standardHeight * 7.0 + paneRightPadding * 10.0 + labelTools.getHeight();
|
||||
|
||||
listViewMaps.setPrefHeight(standardHeight * 3.0);
|
||||
|
||||
buttonAddMap.setPrefWidth(standardWidth);
|
||||
buttonDeleteMap.setPrefWidth(standardWidth);
|
||||
|
||||
buttonAddBoat.setPrefWidth(standardWidth);
|
||||
buttonAddBoat.setTranslateX(paneRightPadding);
|
||||
buttonAddBoat.setTranslateY(topMargin);
|
||||
topMargin += standardHeight + paneRightPadding;
|
||||
|
||||
textFieldPosition.setPrefWidth(standardWidth);
|
||||
textFieldPosition.setTranslateX(paneRightPadding);
|
||||
textFieldPosition.setTranslateY(topMargin);
|
||||
topMargin += standardHeight + paneRightPadding;
|
||||
|
||||
buttonRemoveBoat.setPrefWidth(standardWidth);
|
||||
buttonRemoveBoat.setTranslateX(paneRightPadding);
|
||||
buttonRemoveBoat.setTranslateY(topMargin);
|
||||
topMargin += standardHeight + paneRightPadding;
|
||||
|
||||
buttonShowRemovedBoat.setPrefWidth(standardWidth);
|
||||
buttonShowRemovedBoat.setTranslateX(paneRightPadding);
|
||||
buttonShowRemovedBoat.setTranslateY(topMargin);
|
||||
topMargin += standardHeight + paneRightPadding * 3.0;
|
||||
|
||||
buttonShowStorage.setPrefWidth(standardWidth);
|
||||
buttonShowStorage.setTranslateX(paneRightPadding);
|
||||
buttonShowStorage.setTranslateY(topMargin);
|
||||
topMargin += standardHeight + paneRightPadding;
|
||||
|
||||
buttonShowOnMap.setPrefWidth(standardWidth);
|
||||
buttonShowOnMap.setTranslateX(paneRightPadding);
|
||||
buttonShowOnMap.setTranslateY(topMargin);
|
||||
|
||||
int _distanceBetweenMoveButtons = 5;
|
||||
double moveButtonsSize = 30.0;
|
||||
double moveButtonsXMargin = (paneRightWidth - moveButtonsSize * 3.0 - _distanceBetweenMoveButtons * 2.0) / 2.0;
|
||||
|
||||
buttonUp.setTranslateY(rootHeight - moveButtonsSize * 2.0 - _distanceBetweenMoveButtons - paneRightPadding);
|
||||
buttonUp.setTranslateX(rootWidth - moveButtonsSize * 2.0 - moveButtonsXMargin - _distanceBetweenMoveButtons);
|
||||
|
||||
buttonDown.setTranslateY(rootHeight - moveButtonsSize - paneRightPadding);
|
||||
buttonDown.setTranslateX(rootWidth - moveButtonsSize * 2.0 - moveButtonsXMargin - _distanceBetweenMoveButtons);
|
||||
|
||||
buttonLeft.setTranslateY(rootHeight - moveButtonsSize - paneRightPadding);
|
||||
buttonLeft.setTranslateX(rootWidth - moveButtonsSize * 3.0 - moveButtonsXMargin - _distanceBetweenMoveButtons * 2.0);
|
||||
|
||||
buttonRight.setTranslateY(rootHeight - moveButtonsSize - paneRightPadding);
|
||||
buttonRight.setTranslateX(rootWidth - moveButtonsSize - moveButtonsXMargin);
|
||||
}
|
||||
public static void main(String[] args)
|
||||
{
|
||||
launch();
|
||||
}
|
||||
}
|
@ -11,24 +11,23 @@ import javafx.stage.Stage;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class FormMap extends Application {
|
||||
public class FormSetMixedBoats extends Application {
|
||||
@Override
|
||||
public void start(Stage stage) throws IOException {
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(FormMap.class.getResource("form-map-view.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load(), 800, 800);
|
||||
FXMLLoader fxmlLoader = new FXMLLoader(FormSetMixedBoats.class.getResource("form-set-mixed-boats-view.fxml"));
|
||||
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
|
||||
|
||||
stage.setTitle("Map");
|
||||
stage.setTitle("Set mixed boats");
|
||||
stage.setScene(scene);
|
||||
|
||||
FirstUpdateGUI(scene);
|
||||
stage.show();
|
||||
}
|
||||
|
||||
private void FirstUpdateGUI(Scene scene) {
|
||||
private void FirstUpdateGUI(Scene scene)
|
||||
{
|
||||
Pane root = (Pane)scene.lookup("#root");
|
||||
Canvas canvas = (Canvas)scene.lookup("#canvas");
|
||||
Button buttonCreate = (Button)scene.lookup("#buttonCreate");
|
||||
Button buttonCreateModif = (Button)scene.lookup("#buttonCreateModif");
|
||||
Button buttonUp = (Button)scene.lookup("#buttonUp");
|
||||
Button buttonLeft = (Button)scene.lookup("#buttonLeft");
|
||||
Button buttonRight = (Button)scene.lookup("#buttonRight");
|
||||
@ -40,7 +39,6 @@ public class FormMap extends Application {
|
||||
|
||||
double flowPaneHeight = flowPane.getHeight();
|
||||
double buttonCreateHeight = buttonCreate.getHeight();
|
||||
double buttonCreateWidth = buttonCreate.getWidth();
|
||||
double rootWidth = root.getWidth();
|
||||
double rootHeight = root.getHeight();
|
||||
double rootPadding = 10.0;
|
||||
@ -51,9 +49,8 @@ public class FormMap extends Application {
|
||||
flowPane.setPrefWidth(rootWidth);
|
||||
canvas.setHeight(rootHeight - flowPaneHeight);
|
||||
flowPane.setTranslateY(rootHeight - flowPaneHeight);
|
||||
buttonCreateModif.setTranslateX(rootPadding + buttonCreateWidth + distanceBetweenButtons);
|
||||
buttonCreate.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
buttonCreateModif.setTranslateY(rootHeight - flowPaneHeight - buttonCreateHeight - rootPadding);
|
||||
|
||||
buttonCreate.setTranslateY(rootHeight - flowPaneHeight - rootPadding - buttonCreateHeight);
|
||||
|
||||
buttonUp.setTranslateY(rootHeight - flowPaneHeight - buttonMoveSize * 2.0 - rootPadding -
|
||||
distanceBetweenButtons);
|
@ -0,0 +1,126 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
import javafx.scene.paint.Color;
|
||||
|
||||
public class MapWithSetBoatsGeneric <T extends IDrawningObject, U extends AbstractMap> {
|
||||
private final int _pictureWidth;
|
||||
private final int _pictureHeight;
|
||||
private final int _placeSizeWidth = 210;
|
||||
private final int _placeSizeHeight = 90;
|
||||
private final SetBoatsGeneric<T> _setBoats;
|
||||
private GraphicsContext _graphicsContext = null;
|
||||
private final U _map;
|
||||
public MapWithSetBoatsGeneric(int picWidth, int picHeight, U map, GraphicsContext gc) {
|
||||
int width = picWidth / _placeSizeWidth;
|
||||
int height = picHeight / _placeSizeHeight;
|
||||
_setBoats = new SetBoatsGeneric<T>(width * height);
|
||||
_pictureWidth = picWidth;
|
||||
_pictureHeight = picHeight;
|
||||
_map = map;
|
||||
_graphicsContext = gc;
|
||||
}
|
||||
public int Add(T armoredVehicle)
|
||||
{
|
||||
return _setBoats.Insert(armoredVehicle);
|
||||
}
|
||||
public T Delete(int position)
|
||||
{
|
||||
return _setBoats.Remove(position);
|
||||
}
|
||||
public T Get(int position)
|
||||
{
|
||||
return _setBoats.Get(position);
|
||||
}
|
||||
public void ShowOnMap() {
|
||||
Shaking();
|
||||
for (T boat : _setBoats) {
|
||||
if (boat != null) {
|
||||
_map.CreateMap(_pictureWidth, _pictureHeight, boat, _graphicsContext);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void ShowSet() {
|
||||
DrawBackground();
|
||||
DrawArmoredVehicles();
|
||||
}
|
||||
public void MoveObject(Direction direction) {
|
||||
if (_map != null) {
|
||||
_map.MoveObject(direction);
|
||||
}
|
||||
}
|
||||
private void Shaking() {
|
||||
int j = _setBoats.GetCount() - 1;
|
||||
for (int i = 0; i < _setBoats.GetCount(); i++) {
|
||||
if (_setBoats.Get(i) == null) {
|
||||
for (; j > i; j--) {
|
||||
var boat = _setBoats.Get(j);
|
||||
if (boat != null) {
|
||||
_setBoats.Insert(boat, i);
|
||||
_setBoats.Remove(j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j <= i) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private void DrawBackground() {
|
||||
_graphicsContext.setFill(Color.rgb(80, 94, 102));
|
||||
_graphicsContext.fillRect(0, 0, _pictureWidth, _pictureHeight);
|
||||
|
||||
_graphicsContext.setStroke(Color.BLACK);
|
||||
_graphicsContext.setLineWidth(3);
|
||||
_graphicsContext.setFill(Color.rgb(127, 104, 88));
|
||||
|
||||
_graphicsContext.beginPath();
|
||||
|
||||
for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) {
|
||||
for (int j = 0; j < _pictureHeight / _placeSizeHeight + 1; ++j) {
|
||||
_graphicsContext.moveTo(i * _placeSizeWidth, j * _placeSizeHeight);
|
||||
_graphicsContext.lineTo(i * _placeSizeWidth + _placeSizeWidth / 2.0F, j * _placeSizeHeight);
|
||||
_graphicsContext.stroke();
|
||||
if (j == _pictureHeight / _placeSizeHeight) {
|
||||
_graphicsContext.fillRect(0, j * _placeSizeHeight + 2, _pictureWidth, _pictureHeight - j * _placeSizeHeight);
|
||||
}
|
||||
}
|
||||
if (i == _pictureWidth / _placeSizeWidth - 1) {
|
||||
_graphicsContext.fillRect(i * _placeSizeWidth + _placeSizeWidth / 2.0F, 0, _pictureWidth - (i * _placeSizeWidth + _placeSizeWidth / 2.0F), _pictureHeight);
|
||||
}
|
||||
else {
|
||||
_graphicsContext.fillRect(i * _placeSizeWidth + _placeSizeWidth / 2.0F, 0, _placeSizeWidth / 2.0F, _pictureHeight);
|
||||
}
|
||||
_graphicsContext.moveTo(i * _placeSizeWidth, 0);
|
||||
_graphicsContext.lineTo(i * _placeSizeWidth, (_pictureHeight / _placeSizeHeight) * _placeSizeHeight);
|
||||
_graphicsContext.stroke();
|
||||
_graphicsContext.closePath();
|
||||
}
|
||||
}
|
||||
private void DrawArmoredVehicles() {
|
||||
int yNumOfPlaces = _pictureHeight / _placeSizeHeight;
|
||||
int xNumOfPlaces = _pictureWidth / _placeSizeWidth;
|
||||
|
||||
int RowIndex = yNumOfPlaces - 1;
|
||||
int ColumnIndex = 0;
|
||||
|
||||
for (T armoredVehicle : _setBoats) {
|
||||
if (armoredVehicle != null) {
|
||||
float[] position = armoredVehicle.GetCurrentPosition();
|
||||
armoredVehicle.SetObject(ColumnIndex *_placeSizeWidth,
|
||||
RowIndex * _placeSizeHeight + (_placeSizeHeight - (int)(position[3] - position[1])),
|
||||
_pictureWidth, _pictureHeight);
|
||||
armoredVehicle.DrawningObject(_graphicsContext);
|
||||
}
|
||||
if (ColumnIndex == xNumOfPlaces - 1) {
|
||||
ColumnIndex = 0;
|
||||
RowIndex--;
|
||||
}
|
||||
else {
|
||||
ColumnIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import javafx.scene.canvas.GraphicsContext;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Set;
|
||||
|
||||
public class MapsCollection {
|
||||
private final HashMap<String, MapWithSetBoatsGeneric<DrawningObjectBoat, AbstractMap>> _mapStorages;
|
||||
private final int _pictureWidth;
|
||||
private final int _pictureHeight;
|
||||
private final GraphicsContext _graphicsContext;
|
||||
public Set<String> GetKeys()
|
||||
{
|
||||
return _mapStorages.keySet();
|
||||
}
|
||||
public MapsCollection(int pictureWidth, int pictureHeight, GraphicsContext graphicsContext) {
|
||||
_mapStorages = new HashMap<>();
|
||||
_pictureWidth = pictureWidth;
|
||||
_pictureHeight = pictureHeight;
|
||||
_graphicsContext = graphicsContext;
|
||||
}
|
||||
public void AddMap(String name, AbstractMap map) {
|
||||
if (_mapStorages.containsKey(name)) {
|
||||
return;
|
||||
}
|
||||
MapWithSetBoatsGeneric<DrawningObjectBoat, AbstractMap> newMap =
|
||||
new MapWithSetBoatsGeneric<>(_pictureWidth, _pictureHeight, map, _graphicsContext);
|
||||
_mapStorages.put(name, newMap);
|
||||
}
|
||||
public void DelMap(String name)
|
||||
{
|
||||
_mapStorages.remove(name);
|
||||
}
|
||||
public MapWithSetBoatsGeneric<DrawningObjectBoat, AbstractMap> Get(String ind) {
|
||||
if (_mapStorages.containsKey(ind)) {
|
||||
return _mapStorages.get(ind);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public DrawningObjectBoat Get(String ind, int position) {
|
||||
if (_mapStorages.containsKey(ind)) {
|
||||
return _mapStorages.get(ind).Get(position);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
public class SetBoatsGeneric <T> implements Iterable<T> {
|
||||
private final ArrayList<T> _places;
|
||||
private final int _maxCount;
|
||||
public int GetCount()
|
||||
{
|
||||
return _places.size();
|
||||
}
|
||||
public SetBoatsGeneric(int count) {
|
||||
_maxCount = count;
|
||||
_places = new ArrayList<T>();
|
||||
}
|
||||
public int Insert(T boat)
|
||||
{
|
||||
return Insert(boat, 0);
|
||||
}
|
||||
public int Insert(T boat, int position) {
|
||||
if (position < 0 || position > GetCount() || GetCount() == _maxCount) {
|
||||
return -1;
|
||||
}
|
||||
_places.add(position, boat);
|
||||
return position;
|
||||
}
|
||||
public T Remove(int position) {
|
||||
if (position < 0 || position >= GetCount()) {
|
||||
return null;
|
||||
}
|
||||
return _places.remove(position);
|
||||
}
|
||||
public T Get(int position) {
|
||||
if (position < 0 || position >= GetCount()) {
|
||||
return null;
|
||||
}
|
||||
return _places.get(position);
|
||||
}
|
||||
public void Set(int position, T value) {
|
||||
if (position < 0 || position >= GetCount()) {
|
||||
return;
|
||||
}
|
||||
Insert(value, position);
|
||||
}
|
||||
@Override
|
||||
public Iterator<T> iterator()
|
||||
{
|
||||
return _places.iterator();
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package com.example.pibd22_kalyshev_y_v_motorboat_hard;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.Random;
|
||||
|
||||
public class SetMixedBoatsGeneric<T extends EntityBoat, U extends IDrawningAdditionalElement> {
|
||||
private final T[] _boats;
|
||||
private final U[] _additionalElements;
|
||||
private final int _maxCount;
|
||||
private int _boatsCount;
|
||||
private int _additionalElementsCount;
|
||||
public SetMixedBoatsGeneric(int maxCount, Class<T> objectT, Class<U> objectU) {
|
||||
@SuppressWarnings("unchecked")
|
||||
final T[] boats = (T[]) Array.newInstance(objectT, maxCount);
|
||||
_boats = boats;
|
||||
@SuppressWarnings("unchecked")
|
||||
final U[] additionalElements = (U[]) Array.newInstance(objectU, maxCount);
|
||||
_additionalElements = additionalElements;
|
||||
_maxCount = maxCount;
|
||||
_boatsCount = 0;
|
||||
_additionalElementsCount = 0;
|
||||
}
|
||||
public boolean AddBoat(T boat) {
|
||||
if (_boatsCount == _maxCount) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
_boats[_boatsCount] = boat;
|
||||
_boatsCount++;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public boolean AddAdditionalElement(U additionalElement) {
|
||||
if (_additionalElementsCount == _maxCount) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
_additionalElements[_additionalElementsCount] = additionalElement;
|
||||
_additionalElementsCount++;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
public DrawningBoat GetRandomBoat() {
|
||||
if (_boatsCount == 0 || _additionalElementsCount == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Random random = new Random();
|
||||
T randomArmoredVehicle = _boats[random.nextInt(0, _boatsCount)];
|
||||
U randomAdditionalElement = _additionalElements[random.nextInt(0, _additionalElementsCount)];
|
||||
|
||||
return new DrawningBoat(randomArmoredVehicle, randomAdditionalElement);
|
||||
}
|
||||
}
|
@ -11,11 +11,11 @@
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.image.ImageView?>
|
||||
<?import javafx.scene.image.Image?>
|
||||
<Pane xmlns:fx="http://javafx.com/fxml" fx:id="root" fx:controller="com.example.pibd22_kalyshev_y_v_motorboat_hard.ControllerBoat"
|
||||
style="-fx-background-color: #31374c;">
|
||||
<?import javafx.scene.control.ColorPicker?>
|
||||
<Pane xmlns:fx="http://javafx.com/fxml" fx:id="root" fx:controller="com.example.pibd22_kalyshev_y_v_motorboat_hard.ControllerBoat">
|
||||
<Canvas fx:id="canvas">
|
||||
</Canvas>
|
||||
<FlowPane fx:id="flowPane">
|
||||
<FlowPane fx:id="flowPane" style="-fx-background-color: #31374c;">
|
||||
<Label style="-fx-text-fill: #b8becc; -fx-padding: 5 5 5 5;">
|
||||
Speed:
|
||||
</Label>
|
||||
@ -31,13 +31,15 @@
|
||||
<Label style="-fx-text-fill: #b8becc; -fx-padding: 5 5 5 5;">
|
||||
Color:
|
||||
</Label>
|
||||
<Label fx:id="labelBodyColorValue" style="-fx-text-fill: #ffffff; -fx-padding: 5 5 5 0; -fx-font-weight: bold;">
|
||||
-
|
||||
</Label>
|
||||
<ColorPicker fx:id="bodyColorPicker" onAction="#BodyColorPicker_Changed"/>
|
||||
<Label style="-fx-text-fill: #b8becc; -fx-padding: 5 5 5 5;">
|
||||
Rollers:
|
||||
DopColor:
|
||||
</Label>
|
||||
<ComboBox fx:id="comboBoxNumOars" value="5" onAction="#ComboBoxNumOfRollers_Changed">
|
||||
<ColorPicker fx:id="dopColorPicker" onAction="#DopColorPicker_Changed"/>
|
||||
<Label style="-fx-text-fill: #b8becc; -fx-padding: 5 5 5 5;">
|
||||
Oars:
|
||||
</Label>
|
||||
<ComboBox fx:id="comboBoxNumOars" value="1" onAction="#ComboBoxNumOars_Changed">
|
||||
<items>
|
||||
<FXCollections fx:factory="observableArrayList">
|
||||
<String fx:value="1"/>
|
||||
@ -49,12 +51,12 @@
|
||||
<Label style="-fx-text-fill: #b8becc; -fx-padding: 5 5 5 5;">
|
||||
Ornament:
|
||||
</Label>
|
||||
<ComboBox fx:id="comboBoxOarsType" value="None" onAction="#ComboBoxOrnamentType_Changed">
|
||||
<ComboBox fx:id="comboBoxOrnamentType" value="None" onAction="#ComboBoxOrnamentType_Changed">
|
||||
<items>
|
||||
<FXCollections fx:factory="observableArrayList">
|
||||
<String fx:value="None"/>
|
||||
<String fx:value="Slim"/>
|
||||
<String fx:value="Large"/>
|
||||
<String fx:value="Dots"/>
|
||||
<String fx:value="Circles"/>
|
||||
</FXCollections>
|
||||
</items>
|
||||
</ComboBox>
|
||||
@ -93,4 +95,7 @@
|
||||
</ImageView>
|
||||
</graphic>
|
||||
</Button>
|
||||
<Button fx:id="buttonSelectArmoredVehicle">
|
||||
Select
|
||||
</Button>
|
||||
</Pane>
|
Loading…
Reference in New Issue
Block a user