JavaFX Label не обновляется - PullRequest
2 голосов
/ 11 марта 2020

У меня есть файл .f xml с тегом <Label> и <ImageView>. В моем классе контроллера есть функция события, которая вызывается, ImageView обновляется, но моя метка остается прежней. Вся помощь определенно приветствуется.

Мой контроллер:

public class LayoutController implements BrowserPlaybackEvent {
    @FXML
    public ImageView currentTrack;

    @FXML
    public Label trackTitle;

    SpotySync spotySync;
    public LayoutController(){
        this.spotySync = Main.spotySync;
        spotySync.addBrowserPlaybackEventListerners(this);
    }



    @Override
    public void browserPlaybackEvent(JSONObject playBackState) {
        System.out.println("Layout controller handling browser event");
        Track track = new Track((JSONObject) ((JSONObject) playBackState.get("track_window")).get("current_track"));
        trackTitle.setText(track.name);
        currentTrack.setImage(track.tAlbum.image);

    }
}

.jf xml Файл:

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="729.0" prefWidth="861.0" styleClass="HBox" stylesheets="@stylesheet.css" xmlns="http://javafx.com/javafx/10.0.2-internal" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nl.nothic.spotysync.ui.LayoutController">

   <children>
      <Pane prefHeight="200.0" prefWidth="617.0" />
      <Pane prefHeight="200.0" prefWidth="200.0" />
      <Pane id="currentlyPlaying" maxHeight="300.0" minHeight="300.0" prefHeight="300.0" prefWidth="200.0">
         <Label>
            <graphic>

               <ImageView fx:id="currentTrack">
                  <image>
                     <Image url="https://i.scdn.co/image/ab67616d00001e02eb9888357d422ff3e6bf0321" />
                  </image>
               </ImageView>

            </graphic>
         </Label>

         <Label fx:id="trackTitle" alignment="CENTER" layoutX="300.0" layoutY="14.0" prefHeight="45.0" prefWidth="550.0" text="Song title" textAlignment="CENTER" textFill="WHITE" wrapText="true">
            <font>
               <Font size="30.0" />
            </font>
         </Label>

      </Pane>
   </children>
</VBox>

Класс приложения:

public class Gui extends Application{
    SpotySync spotySync = null;

    @Override
    public void start(Stage primaryStage) throws IOException {

        Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getClassLoader().getResource("nl/nothic/spotysync/ui/Layout.fxml")));


        Scene scene = new Scene(root,600,600);
        scene.getStylesheets().add(getClass().getClassLoader().getResource("nl/nothic/spotysync/ui/stylesheet.css").toExternalForm());

        primaryStage.setTitle("SpotySync");
        primaryStage.setScene(scene);
        primaryStage.show();


    }

    public static void launch(){
        Application.launch();
    }

}

Проблема, которую я получаю, заключается в контроллере. При вызове browserPlaybackEvent воспроизводится новая дорожка, а приложение обновляется. Imageview (currentTrack) обновляется, также визуально в самом приложении. Я отладил код, и track.name является допустимым текстом, и объект также обновляется новым текстом. Однако в приложении обновляется только изображение.

Я потратил около часа, пытаясь определить проблему без результатов.

Заранее спасибо

1 Ответ

3 голосов
/ 11 марта 2020

Я не уверен, почему, но я думаю, что проблема заключается в том, что событие вызывается в другом потоке (я не эксперт по потокам, поэтому я могу ошибаться). Я не подозревал, что причина в том, что элемент ImageView обновился.

Для решения. Чтобы получить правильный поток для обновления текста, который я использовал:

Platform.runLater(() -> {
    trackTitle.setText(track.name);
});

Это (я думаю) перемещает обновление в правильный поток и обновляет <Label>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...