/
Maksim_Shchelochok
/
Course_Work
Обзор
Документация
Войти
/
Maksim_Shchelochok
/
Course_Work
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/controller/SpecialityController.java
141 строка
5 KB
Maksim
Создан контроллер для Speciality
23 июн 2026, 00:46
23 июн 2026, 00:46
13b7c2f
Код
Авторство
О чём код?
package controller; import javafx.geometry.Insets; import javafx.scene.control.*; import javafx.scene.layout.GridPane; import javafx.scene.layout.Region; import model.Direction; import model.Speciality; import model.SpecialityManager; import view.EntityTableView; import java.util.List; import java.util.Optional; public class SpecialityController { private final SpecialityManager manager = new SpecialityManager(); private final EntityTableView view; public SpecialityController(boolean canEdit) { this.view = new EntityTableView( new String[]{"ID", "Название", "Направление"}, canEdit); view.getRefreshButton().setOnAction(e -> refresh()); if (canEdit) { view.getAddButton().setOnAction(e -> add()); view.getEditButton().setOnAction(e -> edit()); view.getDeleteButton().setOnAction(e -> delete()); } refresh(); } public Region getView() { return view; } private void refresh() { List<Speciality> data = manager.getAll(); view.setData(data); } private void add() { // existingName=null, existingDirId=-1 — режим добавления (форма пустая) showDialog("Добавить специальность", null, -1, newSpec -> { String error = manager.create(newSpec.getName(), newSpec.getDirectionId()); if (error != null) error(error); refresh(); }); } private void edit() { Object[] row = view.getSelectedRow(); if (row == null) { info("Выберите строку для изменения."); return; } int id = Integer.parseInt(row[0].toString()); String currentName = row[1].toString(); // Нахождение текущего направления выбранной специальности (по списку из getAll) int currentDirId = -1; for (Speciality s : manager.getAll()) { if (s.getSpecialityId() == id) { currentDirId = s.getDirectionId(); break; } } showDialog("Изменить специальность", currentName, currentDirId, newSpec -> { String error = manager.update(id, newSpec.getName(), newSpec.getDirectionId()); if (error != null) error(error); refresh(); }); } private void delete() { Object[] row = view.getSelectedRow(); if (row == null) { info("Выберите строку для удаления."); return; } int id = Integer.parseInt(row[0].toString()); String error = manager.delete(id); if (error != null) error(error); refresh(); } // Показывает форму: "Название" + список направлений private void showDialog(String title, String existingName, int existingDirId, java.util.function.Consumer<Speciality> onOk) { Dialog<Speciality> dialog = new Dialog<>(); dialog.setTitle(title); dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL); TextField nameField = new TextField(); if (existingName != null) nameField.setText(existingName); // Выпадающий список направлений ComboBox<Direction> directionBox = new ComboBox<>(); List<Direction> directions = manager.getAllDirections(); directionBox.getItems().addAll(directions); // Чтобы в списке показывались названия, а не объекты — задаём отображение directionBox.setConverter(new javafx.util.StringConverter<Direction>() { @Override public String toString(Direction d) { return d == null ? "" : d.getName(); } @Override public Direction fromString(String s) { return null; } }); // При редактировании выбрать текущее направление if (existingDirId != -1) { for (Direction d : directions) { if (d.getId() == existingDirId) { directionBox.setValue(d); break; } } } GridPane grid = new GridPane(); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(20)); grid.add(new Label("Название:"), 0, 0); grid.add(nameField, 1, 0); grid.add(new Label("Направление:"), 0, 1); grid.add(directionBox, 1, 1); dialog.getDialogPane().setContent(grid); dialog.setResultConverter(button -> { if (button == ButtonType.OK) { Direction chosen = directionBox.getValue(); if (chosen == null) return null; //направление не выбрано return new Speciality(0, nameField.getText(), chosen.getId(), chosen.getName()); } return null; }); Optional<Speciality> result = dialog.showAndWait(); if (result.isPresent()) { onOk.accept(result.get()); } } private void info(String text) {alert(Alert.AlertType.INFORMATION, text);} private void error(String text) {alert(Alert.AlertType.ERROR, text);} private void alert(Alert.AlertType type, String text) { Alert a = new Alert(type); a.setHeaderText(null); a.setContentText(text); a.showAndWait(); } }