【发布时间】:2019-03-02 17:23:19
【问题描述】:
我的 JavaFX 应用程序的 Stackpane 中嵌套了一个 ImageView:
UiManager.java
@Override
public void start(Stage primaryStage) {
logger.info("Starting UI...");
//Set the application icon.
primaryStage.getIcons().add(getImage(ICON_APPLICATION));
try {
mainWindow = new MainWindow(primaryStage, logic);
mainWindow.show(); //This should be called before creating other UI parts
mainWindow.fillInnerParts();
} catch (Throwable e) {
logger.severe(StringUtil.getDetails(e));
showFatalErrorDialogAndShutdown("Fatal error during initializing", e);
}
}
MainWindow.java
// Independent Ui parts residing in this Ui container
private ImagePanel imagePanel;
private PersonListPanel personListPanel;
private ResultDisplay resultDisplay;
private HelpWindow helpWindow;
@FXML
private StackPane imagePlaceholder;
@FXML
private StackPane commandBoxPlaceholder;
@FXML
private MenuItem helpMenuItem;
@FXML
private StackPane personListPanelPlaceholder;
@FXML
private StackPane resultDisplayPlaceholder;
@FXML
private StackPane statusbarPlaceholder;
void fillInnerParts() {
imagePanel = new ImagePanel();
imagePlaceholder.getChildren().add(imagePanel.getRoot());
personListPanel = new PersonListPanel(logic.getFilteredPersonList(), logic.selectedPersonProperty(),
logic::setSelectedPerson);
personListPanelPlaceholder.getChildren().add(personListPanel.getRoot());
resultDisplay = new ResultDisplay();
resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot());
StatusBarFooter statusBarFooter = new StatusBarFooter(logic.getAddressBookFilePath(), logic.getAddressBook());
statusbarPlaceholder.getChildren().add(statusBarFooter.getRoot());
CommandBox commandBox = new CommandBox(this::executeCommand, logic.getHistory());
commandBoxPlaceholder.getChildren().add(commandBox.getRoot());
//imagePlaceholder.getChildren().add(imagePanel.getRoot());
}
ImagePanel.java
public class ImagePanel extends UiPart<Region> {
private static final String FXML = "ImagePanel.fxml";
@FXML
private ImageView imageView;
public ImagePanel() {
super(FXML);
imageView.setImage(new Image("/assets/1.png"));
}
public void updateView() {
imageView.setImage(new Image("/assets/3.png"));
}
}
考虑到我实际上是在修改现有项目,我提取了相关部分。
在这里,我尝试创建一个单独的方法updateView(),我将在我的程序的另一个类中将其调用为new ImagePanel().updateView()
但在这种情况下,无论我怎么称呼updateView(),图像都不会改变。
【问题讨论】:
-
是什么阻止您使用所需的
Image实例调用ImageView#setImage()? -
我试过了,但它似乎根本没有改变图像。
-
您能告诉我们您是如何更改图像的吗?
-
谢谢,我在我的问题中添加了更多关于实现的细节。
-
您确实意识到在调用
new ImagePanel(). updateView()时您正在创建一个新的(不相关的)实例,对吧? (曾经读过/听说过java中的静态与非静态?)。简而言之:获取MainWindow中的实例并调用updateView以使其工作。