尽管FXML< - >之间的链接没有更新BorderPane控制器< - >申请子类

时间:2017-11-12 05:33:24

标签: java javafx fxml scene borderpane

相关文件:(对任何格式化道歉,多次尝试使其工作)

如果文件不足,则存储库位于:https://github.com/TheeNinja/StockLookupTool

stock_lookup_tool_main.fxml

<BorderPane fx:id="borderPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1" fx:controller="me.theeninja.stocklookuptool.gui.StockLookupToolApplicationController">
<top>
    ...    
</top>
<left />
<center /> 
</BorderPane>

stock_information_center.fxml

<GridPane xmlns="http://javafx.com/javafx"
        xmlns:fx="http://javafx.com/fxml"
        fx:controller="me.theeninja.stocklookuptool.gui.selection.StockSearchSelectionController"
        prefHeight="400.0" prefWidth="600.0"
        fx:id="stockInformationCenter">

</GridPane>

favorite_stocks_sidebar.fxml

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="me.theeninja.stocklookuptool.gui.selection.StockSearchSelectionController" fx:id="verticalStockList">
    ...
</VBox>

StockLookupTool.java(带有start方法的类)

public class StockLookupTool extends Application {


....
@Override
public void start(Stage stage) throws Exception {

    ...
    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/fxml/stock_lookup_tool_main.fxml"));
    Parent root = loader.load();

    Scene scene = new Scene(root, 250, 300);

    stage.setTitle(APPLICATION_TITLE);
    stage.setScene(scene);
    stage.setFullScreen(true);
    stage.show();
}
....
}

StockLookupToolApplicationController(stock_lookup_tool_main.fxml的控制器)

public class StockLookupToolApplicationController {

...

@FXML public Label stockSearchLabel;
@FXML public Label newsLabel;
@FXML public Label settings;

@FXML public BorderPane borderPane;
@FXML public HBox topApplicationNavigation;

@FXML
public void handleStockSearchSelection() {
    logger.log(Level.INFO, "Setting GUI View to Stock Search");
    setView(StockSearchSelectionController.getInstance());
}

private void setView(Selection selection) {
    borderPane.setLeft(selection.getLeft());
    borderPane.setCenter(selection.getCenter());
    borderPane.setRight(selection.getRight());
    borderPane.setBottom(selection.getBottom());
}
}

StockSearchSelectionController.java(的控制器 stock_information_center.fxml和favorite_stocks_sidebar.fxml)

public class StockSearchSelectionController implements Selection {

@FXML public Label favoriteStocksLabel;
@FXML public TextField addFavoriteStockInput;
@FXML public VBox verticalStockList;
@FXML public HBox addFavoriteStockInputContainer;
@FXML public GridPane stockInformationCenter;

@FXML
public void handleFavoriteStockInput(KeyEvent keyEvent) {
    if (keyEvent.getCode() == KeyCode.ENTER) {
    ...
        // makes visual changes to both stockInformationCenter AND verticalStockList, hence I need access to both fxml files (which is why this controls both).
    }
}

@Override
public Node getLeft() {
    return verticalStockList;
}

@Override
public Node getCenter() {
    return stockInformationCenter;
}
}

更多信息:

界面Selection包含方法getLeft()getCenter()(以及其他不相关的方法)。这两个都返回Node。在stock_lookup_tool_main.fxml中,在top的{​​{1}}部分,我有一个按钮(在提供的代码段中删除),按下时,会调用BorderPane(此方法确实调用了发生了,我用记录器验证了它。

现在有一个控制器可以控制 handleStockSearchSelection()stock_information_center.fxml。该控制器实现favorite_stocks_sidebar.fxml,然后实现SelectiongetLeft()getCenter()返回VBox变量 与getLeft()相关联,而favorite_stocks_sidebar.fxml返回与getCenter()相关的GridPane变量。调用stock_information_center.fxml时,borderPane对象的左侧部分设置为VBox,中心设置为GridPane。所有这些方法调用/操作都已经过验证。但是,场景没有视觉变化。

我的问题是:为什么这些对borderPane的更改没有在场景中直观地实现?我在场景&lt; - &gt;之间建立了一个链接。 handleStockSearchSelection()通过设置加载程序的位置。我还在stock_lookup_tool_main.fxml&lt; - &gt;之间建立了链接。它的控制器,因此他们应该分享变化。我通过在变量上调用setLeft()和setCenter()(与ID,borderPane同名)修改了控制器中stock_lookup_tool_main.fxml的边框窗格。然而,视觉上的场景并没有改变。

0 个答案:

没有答案