简体   繁体   中英

How to NOT use thread.sleep for an image slide show in java

I'm trying to create something like an info screen that just scrolls through images (and maybe one day pdfs) that are uploaded with a small managment app I wrote.

After some reading I think I understand why I should NOT have Thread.sleep in my for loop. I read some posts on stackoverflow and other pages that teached me not to do it.

Apparently I'm supposed to use ExecutorService for something like this, but I can't wrap my head around it.

So after preparing my GUI and everything else I finally call my showImages and stay in this while loop. After each loop I reload the records from the file systems, so any changes are represented on the screen.

I created a metafile containing the preferred delay for each image and just sleep for the amount of time.

private void showImages() {
        //noinspection InfiniteLoopStatement
        while (true) {
            loadRecords();
            for (ImageRecord record : records) {
                System.out.println("Showing: " + record.getFilename());
                imageLabel.setIcon(record.getIconForInfoScreen(screenWidth, screenHeight));
                int delay = record.getDurationAsInt();
                System.out.println("Waiting for " + delay + " milliseconds");
                try {
                    Thread.sleep(delay);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

So if I understand correctly I could use something like

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(showImage(),0, delay, TimeUnit.MILLISECONDS);

But this would trigger the showImage() every "delay" millisecond and I still need to increment some counter, to get to the next image in my records.

Could someone push me in the right direction? I'm kinda lost at the moment.

All the comments on my question can be considered good ideas an and one of them also lead me to my final result. But it in the end, the matter was, that I did not understand how to implement a timer into my loop.

Or in other words, the loops had to be gone and instead use a counter and set the delay for the follow up record inside the timer loop.

    private void loopImages() {
        loadRecords();
        recordSize = records.size();
        int delay = records.get(1).getDurationAsInt();
        timer = new Timer(delay, e -> showImages());
        timer.start();
    }

    private void showImages() {
        if (recordIndex == recordSize) {
            loadRecords();
            recordSize = records.size();
            recordIndex = 0;
        }

        ImageRecord record = records.get(recordIndex);

        imageLabel.setIcon(record.getIconForInfoScreen(screenWidth, screenHeight));

        recordIndex++;
        if (recordIndex < recordSize) {
            record = records.get(recordIndex);
            int delay = record.getDurationAsInt();
            timer.setDelay(delay);
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM