我有一个带有<Label>
标记和<ImageView>
的.fxml文件。在我的控制器类中,有一个事件函数被调用,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);
}
}
.jfxml文件:
<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是有效的文本,并且该对象也使用新的文本进行了更新。但是,在应用程序中,只有图像会更新。
我花了大约一个小时试图找出问题,但没有结果。
预先感谢
答案 0 :(得分:3)
我不确定为什么,但是我认为问题是必须在不同的线程上调用事件(我不是线程专家,所以我可能是错的)。我不怀疑这是因为ImageView元素确实更新了。
有关解决方案。为了获得正确的线程来更新我使用的文本:
Platform.runLater(() -> {
trackTitle.setText(track.name);
});
此操作(我认为)将更新移至正确的线程并更新<Label>
。