/
Shalva
/
Lab3_SlideNavigationTool
Обзор
Документация
Войти
/
Shalva
/
Lab3_SlideNavigationTool
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/com/example/lab3/ImageController.java
154 строки
5 KB
Kvaratskheliia Shalva
Добавлен исходный код проекта Lab3_SlideNavigationTool
14 июн 2026, 17:20
14 июн 2026, 17:20
781cb59
Код
Авторство
О чём код?
package com.example.lab3; import javafx.animation.FadeTransition; import javafx.animation.KeyFrame; import javafx.animation.ScaleTransition; import javafx.animation.Timeline; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.StackPane; import javafx.stage.DirectoryChooser; import javafx.util.Duration; import java.io.File; public class ImageController { @FXML private ImageView imageView; @FXML private Label counterLabel; @FXML private ComboBox<String> filterComboBox; @FXML private ComboBox<String> animationComboBox; @FXML private TextArea exifTextArea; @FXML private Button playButton; @FXML private StackPane imageContainer; private File currentDirectory; private ImageCollection imageCollection = new ImageCollection(); private ImageIterator iterator; private Timeline slideshowTimeline; private boolean isPlaying = false; @FXML public void initialize() { filterComboBox.getItems().addAll("Все", "JPEG/JPG", "PNG", "GIF"); filterComboBox.getSelectionModel().selectFirst(); animationComboBox.getItems().addAll("Исчезание", "Масштабирование", "Без эффекта"); animationComboBox.getSelectionModel().selectFirst(); setupSlideshow(); } @FXML private void handleSelectFolder() { DirectoryChooser chooser = new DirectoryChooser(); chooser.setTitle("Выберите папку с изображениями"); File selected = chooser.showDialog(imageView.getScene().getWindow()); if (selected != null) { currentDirectory = selected; updateIterator(); } } @FXML private void handleFilterChange() { updateIterator(); } @FXML private void handleNext() { if (iterator != null) playTransition(iterator.next()); } @FXML private void handlePrevious() { if (iterator != null) playTransition(iterator.previous()); } @FXML private void handleFirst() { if (iterator != null) playTransition(iterator.first()); } @FXML private void handleLast() { if (iterator != null) playTransition(iterator.last()); } private void updateIterator() { if (currentDirectory == null) return; String filter = filterComboBox.getValue(); iterator = imageCollection.getIterator(currentDirectory, filter); if (iterator != null && iterator.getTotalCount() > 0) { displayImage(iterator.first()); } else { clearViewer(); } } private void displayImage(File file) { if (file == null) { clearViewer(); return; } Image img = new Image(file.toURI().toString()); imageView.setImage(img); counterLabel.setText((iterator.getIndex() + 1) + " из " + iterator.getTotalCount()); exifTextArea.setText(ExifReaderUtil.getExifInfo(file)); } private void playTransition(File nextFile) { if (nextFile == null) return; String animType = animationComboBox.getValue(); if ("Без эффекта".equals(animType)) { displayImage(nextFile); return; } if ("Исчезание".equals(animType)) { FadeTransition fadeOut = new FadeTransition(Duration.millis(300), imageView); fadeOut.setFromValue(1.0); fadeOut.setToValue(0.0); fadeOut.setOnFinished(e -> { displayImage(nextFile); FadeTransition fadeIn = new FadeTransition(Duration.millis(300), imageView); fadeIn.setFromValue(0.0); fadeIn.setToValue(1.0); fadeIn.play(); }); fadeOut.play(); } else if ("Масштабирование".equals(animType)) { ScaleTransition scaleOut = new ScaleTransition(Duration.millis(300), imageView); scaleOut.setToX(0.0); scaleOut.setToY(0.0); scaleOut.setOnFinished(e -> { displayImage(nextFile); ScaleTransition scaleIn = new ScaleTransition(Duration.millis(300), imageView); scaleIn.setFromX(0.0); scaleIn.setFromY(0.0); scaleIn.setToX(1.0); scaleIn.setToY(1.0); scaleIn.play(); }); scaleOut.play(); } } private void clearViewer() { imageView.setImage(null); counterLabel.setText("0 из 0"); exifTextArea.setText("В данной папке нет файлов, соответствующих фильтру."); if (isPlaying) stopSlideshow(); } @FXML private void handleToggleSlideshow() { if (iterator == null || iterator.getTotalCount() == 0) return; if (isPlaying) { stopSlideshow(); } else { startSlideshow(); } } private void setupSlideshow() { slideshowTimeline = new Timeline(new KeyFrame(Duration.seconds(3), event -> handleNext())); slideshowTimeline.setCycleCount(Timeline.INDEFINITE); } private void startSlideshow() { isPlaying = true; playButton.setText("Стоп"); slideshowTimeline.play(); } private void stopSlideshow() { isPlaying = false; playButton.setText("Автопросмотр"); slideshowTimeline.stop(); } }