Библиотека изображений JavaFX похожа на Picasso или Glide - PullRequest
0 голосов
/ 09 марта 2019

Я ищу библиотеку, которая позволяет мне загружать изображения таким же образом, как Picasso или Glide для Android / Java, я работаю в настольном приложении с использованием JavaFX 2, и загрузка изображений засоряет основной поток. Я думал о создании пользовательских функций с нуля, но я полагаю, что они представляют собой зрелый набор инструментов, позволяющий избежать дополнительной работы. Я пытался загрузить изображение внутри его потока, но оно не работает.

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    final String thumbnail = data.getSong().getThumbnail();

    Runnable runnable = () -> {
        Image image = new Image(thumbnail);
        imageView.setImage(image);
    };
    runnable.run();
}

1 Ответ

0 голосов
/ 09 марта 2019

Для повторяющейся загрузки изображений я бы рекомендовал использовать один из инструментов анимации javafx. PauseTransition - это один из вариантов:

import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class SlideShow extends Application{

    private static int counter =0;
    private ImageView iv;
    private Image[] images;
    private Button swapImage;

    private final String[] urls = {
            "https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/160/lg/57/tropical-fish_1f420.png",
            "https://www.shareicon.net/data/128x128/2015/03/28/14104_animal_256x256.png",
            "https://cdn1.iconfinder.com/data/icons/DarkGlass_Reworked/128x128/apps/gnome-fish.png",
            "http://www.iconsalot.com/asset/icons/freepik/pet-shop-13/128/010-fish-2-icon.png"
    };

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        images = new Image[urls.length];
        for(int i=0; i< urls.length; i++) {
            images[i] = new Image(urls[i], true);
        }

        iv = new ImageView(images[counter++]);
        swapImage = new Button("Start");
        swapImage.setOnAction(e->update());
        BorderPane root = new BorderPane(iv);
        root.setBottom(new StackPane(swapImage));
        Scene scene = new Scene(root,200,200);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void update() {

        swapImage.setDisable(true);
        PauseTransition pause = new PauseTransition(Duration.seconds(1));
        pause.setOnFinished(event ->{
            swapImage();
            pause.play();
        });
        pause.play();   
    }

    private void swapImage() {
        counter = counter % images.length;
        iv.setImage(images[counter++]);
    }

    public static void main(String[] args)  {
        Application.launch(args);
    }
}

В качестве альтернативы вы можете использовать Временная шкала , изменив update():

private void update() {

    swapImage.setDisable(true);
    KeyFrame keyFrame = new KeyFrame(
            Duration.seconds(1),
            event -> swapImage()
    );

    Timeline timeline = new Timeline();
    timeline.setCycleCount(Animation.INDEFINITE);
    timeline.getKeyFrames().add(keyFrame);
    timeline.play();
}

enter image description here

...