Невозможно изменить графику кнопок (просто более общую переменную) в runnable с JavaFX - PullRequest
0 голосов
/ 01 октября 2019

В программе есть два изображения, которые я использую для кнопки загрузки, и одно имеет красный контур, а другое - нет. Когда поток работает или кнопка наведена, я хочу, чтобы там был красный контур. Это все работает, но единственная проблема заключается в том, что у меня есть код в потоке, который пытается изменить изображение статической кнопки под названием «downloadSongs».

При наведении курсора на кнопку и последующем выходе контур появляется и исчезает. Когда поток работает, красная линия также остается. Когда поток завершается, красная линия не исчезает (другими словами, вместо статической переменной ImageView загрузки в классе Download). Тем не менее, он вернется назад, если я наведу курсор мыши и выйду из кнопки после завершения потока.

Код, связанный с проблемой:

В классе:

downloadSongs.setOnMouseEntered(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent t){
                downloadSongs.setGraphic(downloadHover);
            }
        });
        downloadSongs.setOnMouseExited(new EventHandler<MouseEvent>(){
            @Override
            public void handle(MouseEvent t){

                try{
                    if(dnld.isAlive()==false){
                          downloadSongs.setGraphic(download);
                    } 
                }catch(Exception e){
                    downloadSongs.setGraphic(download);
                }
            }
        });
        downloadSongs.setOnMousePressed(new EventHandler<MouseEvent>() {  
        @Override
        public void handle(MouseEvent event) { 

            try{
                if(dnld.isAlive()==true){

                }else{
                    dnld = new Thread(new DownloadThread());
                    dnld.start();
                }
            }catch(Exception e){
                dnld = new Thread(new DownloadThread());
                dnld.start();
            }

В теме:

public class DownloadThread implements Runnable{
    public void run(){
        *function of run which works*
        try {
             *more code*
            } catch (Exception e) {
                            ErrorPopUp.Display();
                            //add in the red line around it being added/taken away
                            Download.downloadSongs.setGraphic(Download.download);
        }
        Download.downloadSongs.setGraphic(Download.download);

1 Ответ

1 голос
/ 01 октября 2019

Вы не можете изменить пользовательский интерфейс вне потока приложения. Все коды пользовательского интерфейса проверяют isFxApplicationThread() и выдают исключение, если нет.

Вам либо нужно вызвать runLater, чтобы убедиться, что ваше обновление выполняется в приложенииили реализовать Task

Чтобы узнать больше о параллелизме в JavaFX, вы можете проверить Параллелизм в JavaFX trail .

...