2016-02-08 4 views
4

Я пытаюсь заполнить ListView из содержимого простого ArrayList. Вот мойМетод инициализации контроллера JavaFX FXML не вызван

Controller.java файл:

package design; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.ResourceBundle; 

import javafx.beans.property.ListProperty; 
import javafx.beans.property.SimpleListProperty; 
import javafx.collections.FXCollections; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.scene.control.Button; 
import javafx.scene.control.ListView; 

public class Controller { 

    @FXML private Button buttontest; 
    @FXML private ListView<Song> listViewofSongs; 

    protected List<Song> songList = new ArrayList<>(); 
    protected ListProperty<Song> listProperty = new SimpleListProperty<Song>(); 
    Song Language = new Song("Peter", "myalbum", "yes", 2010); 

    public void addSong(Song song){ 
     songList.add(song); 
    } 

    public void initialize(URL url, ResourceBundle rb) { 
      addSong(Language); 
      listViewofSongs.setItems(FXCollections.observableList(songList)); 
    } 



} 

А вот мой Style.fxml файл:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.ListView?> 
<?import javafx.scene.control.Separator?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.ColumnConstraints?> 
<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.layout.Pane?> 
<?import javafx.scene.layout.RowConstraints?> 
<?import javafx.scene.text.Font?> 

<GridPane prefHeight="499.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="design.Controller"> 
    <columnConstraints> 
     <ColumnConstraints /> 
     <ColumnConstraints /> 
     <ColumnConstraints maxWidth="0.0" minWidth="0.0" prefWidth="0.0" /> 
     <ColumnConstraints maxWidth="0.0" minWidth="0.0" prefWidth="0.0" /> 
    </columnConstraints> 
    <rowConstraints> 
     <RowConstraints /> 
     <RowConstraints /> 
     <RowConstraints maxHeight="0.0" minHeight="0.0" prefHeight="0.0" /> 
     <RowConstraints maxHeight="10.0" minHeight="0.0" prefHeight="0.0" /> 
     <RowConstraints maxHeight="10.0" minHeight="0.0" prefHeight="0.0" /> 
     <RowConstraints fillHeight="false" maxHeight="500.0" minHeight="10.0" prefHeight="240.0" /> 
     <RowConstraints fillHeight="false" maxHeight="500.0" minHeight="10.0" prefHeight="149.0" /> 
     <RowConstraints fillHeight="false" maxHeight="500.0" minHeight="10.0" prefHeight="50.0" /> 
    </rowConstraints> 
    <children> 
     <Pane prefHeight="64.0" prefWidth="700.0"> 
     <children> 
      <Label layoutX="259.0" layoutY="14.0" text="Song Library"> 
       <font> 
        <Font name="Consolas Bold" size="26.0" /> 
       </font> 
       <padding> 
        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> 
       </padding> 
      </Label> 
     </children> 
     </Pane> 
     <Separator prefWidth="200.0" GridPane.rowIndex="4" /> 
     <ListView fx:id="listViewofSongs" editable="true" prefHeight="239.0" prefWidth="700.0" GridPane.rowIndex="5" /> 

     <Label text="Song Info" GridPane.halignment="CENTER" GridPane.rowIndex="6" GridPane.valignment="TOP"> 
     <GridPane.margin> 
      <Insets bottom="10.0" /> 
     </GridPane.margin> 
     <font> 
      <Font name="Consolas" size="22.0" /> 
     </font> 
     <padding> 
      <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> 
     </padding> 
     </Label> 
     <Label GridPane.rowIndex="6" /> 
     <Label text="NAME" GridPane.rowIndex="6"> 
     <font> 
      <Font name="Calibri" size="19.0" /> 
     </font> 
     <GridPane.margin> 
      <Insets bottom="60.0" left="200.0" /> 
     </GridPane.margin> 
     </Label> 
     <TextField maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="343.0" GridPane.rowIndex="6"> 
     <GridPane.margin> 
      <Insets bottom="60.0" left="275.0" /> 
     </GridPane.margin> 
     </TextField> 
     <Label text="ARTIST" GridPane.rowIndex="6"> 
     <font> 
      <Font name="Calibri" size="19.0" /> 
     </font> 
     <GridPane.margin> 
      <Insets left="200.0" /> 
     </GridPane.margin> 
     </Label> 
     <TextField maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="343.0" GridPane.rowIndex="6"> 
     <GridPane.margin> 
      <Insets left="275.0" /> 
     </GridPane.margin> 
     </TextField> 
     <Label text="ALBUM" GridPane.rowIndex="6"> 
     <font> 
      <Font name="Calibri" size="19.0" /> 
     </font> 
     <GridPane.margin> 
      <Insets bottom="-60.0" left="200.0" /> 
     </GridPane.margin> 
     </Label> 
     <TextField maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="343.0" GridPane.rowIndex="6"> 
     <GridPane.margin> 
      <Insets bottom="-60.0" left="275.0" /> 
     </GridPane.margin> 
     </TextField> 
     <Label text="YEAR" GridPane.rowIndex="6"> 
     <font> 
      <Font name="Calibri" size="19.0" /> 
     </font> 
     <GridPane.margin> 
      <Insets bottom="-120.0" left="200.0" /> 
     </GridPane.margin> 
     </Label> 
     <TextField maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="343.0" GridPane.rowIndex="6"> 
     <GridPane.margin> 
      <Insets bottom="-120.0" left="275.0" /> 
     </GridPane.margin> 
     </TextField> 
     <Button mnemonicParsing="false" prefHeight="28.0" prefWidth="75.0" text="ADD" GridPane.rowIndex="7"> 
     <GridPane.margin> 
      <Insets left="125.0" /> 
     </GridPane.margin> 
     <font> 
      <Font name="Corbel" size="15.0" /> 
     </font> 
     </Button> 
     <Button mnemonicParsing="false" prefHeight="28.0" prefWidth="75.0" text="EDIT" GridPane.rowIndex="7"> 
     <font> 
      <Font name="Corbel" size="15.0" /> 
     </font> 
     <GridPane.margin> 
      <Insets left="325.0" /> 
     </GridPane.margin> 
     </Button> 
     <Button mnemonicParsing="false" prefHeight="28.0" prefWidth="75.0" text="DELETE" GridPane.rowIndex="7"> 
     <font> 
      <Font name="Corbel" size="15.0" /> 
     </font> 
     <GridPane.margin> 
      <Insets left="525.0" /> 
     </GridPane.margin> 
     </Button> 
     <Separator orientation="VERTICAL" prefHeight="200.0" GridPane.rowIndex="7"> 
     <GridPane.margin> 
      <Insets left="250.0" /> 
     </GridPane.margin> 
     <padding> 
      <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> 
     </padding> 
     </Separator> 
    </children> 
</GridPane> 

Программа работает, но песня я вошел не появляется в ListView (и класс Song имеет метод toString).

Что я могу сделать?

+0

Почему бы просто не написать 'listViewOfSongs.getItems(). Добавить (песня)' в качестве вашей реализации 'addSong'? – jewelsea

+0

Даже при этом он все еще не отображается. – Laugh7

+0

У вас, вероятно, есть еще одна проблема, обеспечивающая [mcve] (http://stackoverflow.com/help/mcve), которая воспроизводит его. – jewelsea

ответ

8

Проблема заключалась в том, что контроллер не инициализировался в качестве искателя ожидаемого вопроса.

Работа FXMLLoader в Java 8 немного странная.

  1. Если определить метод без параметров initialize() в контроллере и не реализуют интерфейс Initializable, то FXML загрузчик все равно будет автоматически вызывать метод инициализации.

  2. Если вместо этого, вы определяете параметризированный public void initialize(URL url, ResourceBundle rb) метод в контроллере, то FXML загрузчик не будет автоматически вызывать метод инициализации если контроллер также не реализует интерфейс Initializable.

В качестве кода в вопросе использовался параметризованный метод инициализации, а также не выполнялся инициализируемый, инициализация не выполнялась.

+0

Как раз тогда, когда я думал, что все подробности о том, как работает FXMLLoader ... –

+0

Что произойдет, если у вас есть и инициализация no-arg 'initialize' * и * реализация Initializing? Вызывается ли вызов? Сделайте оба? Редактирование. Если посмотреть на код, кажется, что 'Initializable' имеет приоритет и подавляет любой вызов метода no-arg' initialize'. – Itai

+0

Удивительный ответ ... Мне было интересно, как те парни, которые пишут спецификации, могли пропустить такую ​​особенность! БЛАГОДАРЯ –

0

Если я правильно вижу, вы фактически не используете URL-адрес и параметры ResourceBundle в вашем методе initialize(). Если URL-адрес является вашим файлом fxml, а ResourceBundle содержит свойства интернационализации для вашего графического интерфейса, тогда вы должны определить свой метод initialize() без параметров, но с аннотацией @FXML. URL и ResourceBundle должны быть переданы в FXMLLoader.

Как

FXMLLoader loader = new FXMLLoader(URL, rb); 

и

@FXML 
private void initialize() { ... } 

Этот путь initialize() будет вызываться автоматически.

0

Мне нужно было реализовать Initializable для класса и добавить @Override перед вызовом метода.