Java таймер - изпълни задача, изчакай, изпълни задача. Няма Thread.sleep()

Имам програма, в която се опитвам да изпълня задача, изчакайте секунда, преместете лента за напредък и след това изпълнете друга задача, изчакайте, лента за напредък, изпълнете и т.н.

Ако използвам

Thread.sleep()

той замразява графичния ми интерфейс, не позволявайки на лентата за напредъка ми да се движи. Опитах следните въпроси:

Как да настроите таймер в java

Да накарате нещо да чака, без да използвате Thread.sleep()?

Направете програма на Java да заспива без нишки

Моят код е подобен на този:

import java.util.*

...

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(16);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(32);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(48);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(64);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(80);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                try {
                    Runtime.getRuntime().exec("cmd /c del file");
                } catch (IOException ex) {
                    Logger.getLogger(AdminHome.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }, 1000);
        progressBar.setValue(100);
        progressBar.setString("Done!");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {

            }
        }, 1000);
        System.exit(0);

Благодаря предварително за всяка помощ.

Рикорбипро


person Riccorbypro    schedule 17.07.2014    source източник
comment
Ще трябва да стартирате GUI в отделна нишка от вашите задачи   -  person Arno_Geismar    schedule 17.07.2014
comment
it freezes my GUI, not allowing my progress bar to move. Трябва да внедрите фонови задачи (включени чакащи) в отделна нишка. Разгледайте този въпрос   -  person default locale    schedule 17.07.2014
comment
@defaultlocale Опитах SwingWorker, без резултат. Какво друго мога да опитам?   -  person Riccorbypro    schedule 17.07.2014
comment
@Riccorbypro Какво се обърка със SwingWorker? Можете да опитате да създадете Нишки сами, но SwingWorker.doInBackground трябва да направи същото.   -  person default locale    schedule 17.07.2014
comment
Използвам NetBeans IDE, така че когато кодът е подчертан в червено, знам, че нещо не е наред. След като вмъкнах SwingWorker, използвайки знанията, получени от Java API, всичко стана червено и програмата ми дори не стартира. След това изтрих кодовия сегмент и той отново заработи добре.   -  person Riccorbypro    schedule 17.07.2014


Отговори (1)


Всяка обработка трябва да се извършва в нишка, отделна от нишката на GUI (EDT), за да се гарантира, че когато извикате заспиване на нишка, GUI все още реагира. Така че каквото и да правите, за да измервате напредъка или да го емулирате, трябва да се случва в различна нишка от GUI.

Погледни:

Swing Workers

Ленти на напредъка

person robzillaDev    schedule 17.07.2014