JavaFX ошибка взаимодействия с графическими элементами из контроллера

В окне не выводится сообщение, кнопка addWord работает, слово уходит, но не отображается на экране.

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;

public class Controller {
    @FXML
    private TextField inputField;

    @FXML
    private ListView<String> listView;
    private final ObservableList<String> wordlist= FXCollections
            .observableArrayList("Привет", "Я","Тата");

    @FXML
    public void initialize() {
        listView=new ListView<>();
        listView.setItems(wordlist);
    }

    @FXML
    public void addWordToList(){
        String word=inputField.getText();
        listView.getItems().add(word);
        inputField.clear();
    }
}

Класс запуска:

public class Launcher {
    public static void main(String[] args) { Main.main(args);
    }
}

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

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    public final String PATH_TO_FXML= "sample.fxml";
    @Override
    public void start(Stage primaryStage)throws Exception{
        Parent root= FXMLLoader.load(getClass().getResource(PATH_TO_FXML));
        primaryStage.setTitle("Lesson4");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Разметка:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity"
            prefHeight="400.0" prefWidth="418.0" fx:controller= "Controller"
xmlns="http://javafx.com/javafx/11.0.1"
            xmlns:fx="http://javafx.com/fxml/1">
    <top>
        <MenuBar BorderPane.alignment="CENTER">
            <menus>
                <Menu mnemonicParsing="false" text="File">
                    <items>
                        <MenuItem mnemonicParsing="false" text="Close" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Edit">
                    <items>
                        <MenuItem mnemonicParsing="false" text="Delete" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Help">
                    <items>
                        <MenuItem mnemonicParsing="false" text="About" />
                    </items>
                </Menu>
            </menus>
        </MenuBar>
    </top>
    <bottom>
        <SplitPane fx:id="splitPane" dividerPositions="0.7235576923076923" prefHeight="80.0" prefWidth="418.0" BorderPane.alignment="CENTER">
            <items>
                <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
                    <children>
                        <TextField fx:id="inputField" layoutX="-2.0" layoutY="-1.0" onAction="#addWordToList" prefHeight="80.0" prefWidth="301.0" />
                    </children>
                </AnchorPane>
                <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
                    <children>
                        <Button layoutX="-1.0" layoutY="-3.0" mnemonicParsing="false" onAction="#addWordToList" prefHeight="83.0" prefWidth="112.0" text="Add word" />
                    </children>
                </AnchorPane>
            </items>
        </SplitPane>
    </bottom>
</BorderPane>

В чем ошибка?


Ответы (1 шт):

Автор решения: Вадим

у вас в разметке отсутствует ListView, добавьте прежде всего в разметку ListView

<BorderPane>
......
    <center>
          <ListView fx:id="listView" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
    </center>
......
</BorderPane>

в котором указана привязка к компоненту в контроллере через атрибут fx:id в вашем случае имя listView Далее в контроллере уже не нужно создавать ListView строкой listView = new ListView<>(); Так как поле listView у вас привязано к разметке, так что эту строчку удалите и получится:

@FXML
public void initialize() {
    listView.setItems(wordlist);
}
→ Ссылка