setText () не работает при использовании в start () с FXML - PullRequest
0 голосов
/ 25 мая 2018

Когда я пытаюсь изменить или установить текст меток в методе start() (или ранее), это, похоже, не работает.То же самое касается других вещей, например.установка onAction для кнопки - она ​​не работает при установке в start().

Если я позже установлю эти вещи в методе nextTurn(), который активируется кнопкой, они будут установлены.Установка меток и onAction раньше работали до того, как я добавил FXML.

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

Если это так (базовые значения FXML переопределяют то, что установлено в методе start()), где я должен установить начальные значения меток идругие вещи?Предполагается, что начальные значения не могут быть просто введены непосредственно в FXML, так как они должны быть рассчитаны перед отображением экрана.

Ниже кода (несколько непонятно, потому что я пробовал различные варианты):

Базовый класспрограмма:

public class TheCitadel extends Application {

    GameState gameState = GameInitializer.initializeGame(new GameState());
    PlayerCamp playerCamp = (PlayerCamp) gameState.getCamps().get(0);

    //Labels
    @FXML
    Label monthLabel = new Label();
    @FXML
    Label populationLabel = new Label();
    @FXML
    Label foodLabel = new Label();
    @FXML
    Label tradeGoodsLabel = new Label();
    @FXML
    Label craftsmenLabel = new Label();

    //Buttons
    @FXML
    Button nextTurnButton = new Button("Next turn");
    @FXML
    Button addCreaftsmenButton = new Button("Add Craftsmen");
    @FXML
    Button removeCreaftsmenButton = new Button("Remove Craftsmen");


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



        //stage and layout
        Stage mainWindow = primaryStage;
        mainWindow.setTitle("The Citadel");
        //GridPane layout = new GridPane();
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/view/MainScreen.fxml"));
        Parent layout = loader.load();
        Scene mainScene = new Scene(layout);

        mainWindow.setScene(mainScene);
        mainWindow.show();

        monthLabel = new Label("Month: " + gameState.getTime().getCurrentMonth().toString());
        populationLabel = new Label("Population: " + String.valueOf(playerCamp.getPopulation()));
        populationLabel.setText ("Population: " + String.valueOf(playerCamp.getPopulation()));
        foodLabel = new Label("Food: " + String.valueOf(playerCamp.getFood()));
        tradeGoodsLabel = new Label("Trade goods: " + String.valueOf(playerCamp.getTradeGoods()));
        craftsmenLabel = new Label("Craftsmen: " + String.valueOf(playerCamp.getPopulationAsCraftsmen()));

        //buttons
        nextTurnButton.setOnAction(e -> {
                    proceedGameTime();
                    monthLabel.setText(gameState.getTime().getCurrentMonth().toString());
                    populationLabel.setText("Population: " + String.valueOf(playerCamp.getPopulation()));
                    foodLabel.setText("Food: " + String.valueOf(playerCamp.getFood()));
                    tradeGoodsLabel.setText("Trade goods: " + String.valueOf(playerCamp.getTradeGoods()));
                    craftsmenLabel.setText("Craftsmen: " + String.valueOf(playerCamp.getPopulationAsCraftsmen()));
                }
        );



        addCreaftsmenButton.setOnAction(e -> {
            if (playerCamp.getPopulation() >= 1) {
                playerCamp.setPopulation(playerCamp.getPopulation() - 1);
                populationLabel.setText("Population: " + String.valueOf(playerCamp.getPopulation()));
                playerCamp.setPopulationAsCraftsmen(playerCamp.getPopulationAsCraftsmen() + 1);
                craftsmenLabel.setText("Craftsmen: " + String.valueOf(playerCamp.getPopulationAsCraftsmen()));
            }
        });

        removeCreaftsmenButton.setOnAction(e -> {
            if (playerCamp.getPopulationAsCraftsmen() >= 1) {
                playerCamp.setPopulation(playerCamp.getPopulation() + 1);
                populationLabel.setText("Population: " + String.valueOf(playerCamp.getPopulation()));
                playerCamp.setPopulationAsCraftsmen(playerCamp.getPopulationAsCraftsmen() - 1);
                craftsmenLabel.setText("Craftsmen: " + String.valueOf(playerCamp.getPopulationAsCraftsmen()));
            }
        });

        //set layout

       // layout.getChildren().addAll(nextTurnButton, monthLabel, craftsmenLabel, populationLabel, foodLabel, tradeGoodsLabel, addCreaftsmenButton, removeCreaftsmenButton);
        /*
        layout.setPadding(new Insets(10, 10, 10, 10));
        layout.setVgap(5);
        layout.setHgap(5);
        GridPane.setConstraints(textArea, 1, 0);
        GridPane.setConstraints(nextTurnButton, 1, 2);
        GridPane.setConstraints(monthLabel, 0, 2);
        GridPane.setConstraints(populationLabel, 0, 0);
        GridPane.setConstraints(foodLabel, 0, 1);
        GridPane.setConstraints(tradeGoodsLabel, 1, 1);
        GridPane.setConstraints(addCreaftsmenButton, 2, 0);
        GridPane.setConstraints(removeCreaftsmenButton, 1, 0);
        GridPane.setConstraints(craftsmenLabel, 3, 0);
        */

    }


    public static void main(String[] args) {
        //TheCitadel citadel = new TheCitadel();
        launch(args);
    }

    @FXML
    public void nextTurn () {
        proceedGameTime();

       //setting labels and button text here works
        monthLabel.setText(gameState.getTime().getCurrentMonth().toString());
        populationLabel.setText("Population: " + 
        String.valueOf(playerCamp.getPopulation()));
        foodLabel.setText("Food: " + String.valueOf(playerCamp.getFood()));
        tradeGoodsLabel.setText("Trade goods: " + 
        String.valueOf(playerCamp.getTradeGoods()));
        craftsmenLabel.setText("Craftsmen: " + 
        String.valueOf(playerCamp.getPopulationAsCraftsmen()));
        addCreaftsmenButton.setText("THIS BUTTON SHOULD HAVE THIS TEXT AND WORK 
        EARLIER!!!");

       //setting onAction here works

        addCreaftsmenButton.setOnAction(e -> {
            if (playerCamp.getPopulation() >= 1) {
                playerCamp.setPopulation(playerCamp.getPopulation() - 1);
                populationLabel.setText("Population: " + String.valueOf(playerCamp.getPopulation()));
                playerCamp.setPopulationAsCraftsmen(playerCamp.getPopulationAsCraftsmen() + 1);
                craftsmenLabel.setText("Craftsmen: " + String.valueOf(playerCamp.getPopulationAsCraftsmen()));
            }
        });
    }


    public void proceedGameTime() {
        gameState.getTime().proceedGameTime(1);
    }

}

-

FXML:

<AnchorPane prefHeight="600.0" prefWidth="335.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.TheCitadel">
   <children>
      <Button fx:id="nextTurnButton" onAction="#nextTurn" layoutY="551.0" mnemonicParsing="false" prefHeight="48.0" prefWidth="194.0" text="Next turn" AnchorPane.bottomAnchor="1.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" />
      <AnchorPane layoutY="200.0" prefHeight="232.0" prefWidth="335.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" />
      <TabPane layoutX="14.0" layoutY="-17.0" prefHeight="280.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="400.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <tabs>
          <Tab text="Untitled Tab 1">
            <content>
              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="280.0" prefWidth="200.0">
                     <children>
                        <Label  text="33333333" fx:id="populationLabel" layoutX="14.0" layoutY="9.0" />
                        <Label fx:id="tradeGoodsLabel" layoutX="14.0" layoutY="40.0" />
                        <Label fx:id="foodLabel" layoutX="172.0" layoutY="22.0" />
                         <Button fx:id="addCreaftsmenButton" layoutY="551.0" mnemonicParsing="false" prefHeight="48.0" prefWidth="194.0" text="addCreaftsmenButton" AnchorPane.bottomAnchor="1.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" />

                     </children>
              </AnchorPane>
            </content>
          </Tab>
          <Tab text="Untitled Tab 2">
            <content>
              <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
            </content>
          </Tab>
        </tabs>
      </TabPane>
   </children>
</AnchorPane>

1 Ответ

0 голосов
/ 25 мая 2018

Вы не должны создавать экземпляры узлов, помеченных @FXML, они будут внедрены JavaFX, и вы переназначаете их.Избавьтесь от всех new Label() и т. Д. Кроме того, вы не должны использовать класс Application в качестве контроллера.Переместите метки, кнопки и обработчики событий в отдельный класс.Затем в вашем fxml положите #onAction=yourEventHandlerMethod.JavaFX поддерживает

@FXML 
private void initialize()

методы в контроллерах, где вы можете поместить логику инициализации.

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