2016-09-24 5 views
0

У меня есть FXML файл, который выглядит следующим образом:FXML TableView просто показывая пустые строки

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0" 
     xmlns:fx="http://javafx.com/fxml" 
     fx:controller="GUI.Controller"> 
<padding> 
    <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" /> 
</padding> 

<HBox spacing="10" alignment="bottom_right" 
     GridPane.columnIndex="1" GridPane.rowIndex="4"> 
    <Button text="Sign In" 
      onAction="#handleSubmitButtonAction"/> 
</HBox> 

<TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="0"> 
    <columns> 
     <TableColumn fx:id="nameColumn" text="Event Name"> 
     </TableColumn> 
    </columns> 
</TableView> 

и класс контроллера так:

public class Controller implements Initializable { 

@FXML 
private TableView<String> tableView; 

@FXML 
private TableColumn<String, String> nameColumn; 

@FXML 
private ObservableList <String> dataArray; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 


    dataArray = FXCollections.observableArrayList(); 


    nameColumn.setCellValueFactory(
      new PropertyValueFactory<String, String>("nameColumn") 
    ); 


    dataArray.add("hello"); 
    dataArray.add("goodbye"); 


    tableView.setItems(dataArray); 
} 

Когда я запускаю это я получить два столбца (не знаю, почему - одно называется «Имя события», а другое пустое) и две строки, но строки пустые. Вы можете щелкнуть по строкам, но в них нет данных. Когда я удаляю запись «привет» или «прощай» из кода, таблица просто отображает одну пустую строку вместо двух.

Я новичок в Java и не совсем уверен, почему это происходит. Почему появляются строки, но данные не отображаются?

+1

Вам необходимо научиться использовать инструментарий. Заводская фабрика значений не будет работать, если вы используете 'String' для каждой строки в таблице, так как 'String' не имеет метода' nameColumnProperty() 'или' getNameColumn() '. Посмотрите на учебное пособие для табличного представления: многие люди, такие как [этот] (http://code.makery.ch/library/javafx-8-tutorial/) –

ответ

1

Лучший способ использования таблицы - использовать класс для представления данных в таблице. В вашем примере я изменил String на TableModel, где у вас есть одно приветствие имени PropertyString. Теперь вы можете легко использовать этот класс для отображения данных в tabe.

Контроллер:

public class Controller implements Initializable { 

    @FXML private TableView<TableModel> tableView; 

    @FXML private TableColumn<TableModel, String> nameColumn; 

    @FXML private ObservableList<TableModel> dataArray; 

    @Override public void initialize(URL location, ResourceBundle resources) { 

    //add data to Observable List 
    dataArray = FXCollections.observableArrayList(new TableModel("hello"), new TableModel("goodbye")); 

    //crete one column, name "greetings" is the same name property which is in TableModel 
    nameColumn.setCellValueFactory(new PropertyValueFactory<TableModel, String>("greetings")); 

    tableView.setItems(dataArray); 
    } 

    public static class TableModel { 

    StringProperty greetings = new SimpleStringProperty(); 

    public TableModel(String greetings) { 
     this.greetings = new SimpleStringProperty(greetings); 
    } 

    public String getGreetings() { 
     return greetings.get(); 
    } 

    public StringProperty greetingsProperty() { 
     return greetings; 
    } 

    public void setGreetings(String greetings) { 
     this.greetings.set(greetings); 
    } 
    } 

} 

Вы должны добавить этот код, чтобы решить проблему с двумя колоннами.

<columnResizePolicy> 
    <TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/> 
</columnResizePolicy> 

Вот ваш FXML с небольшими изменениями.

<GridPane alignment="CENTER" hgap="10.0" vgap="10.0" xmlns:fx="http://javafx.com/fxml" fx:controller="GUI.Controller"> 
    <padding> 
     <Insets bottom="10.0" left="10.0" right="10.0" top="10.0"/> 
    </padding> 
    <TableView fx:id="tableView" GridPane.columnIndex="0" GridPane.rowIndex="0"> 
     <columnResizePolicy> 
      <TableView fx:constant="CONSTRAINED_RESIZE_POLICY"/> 
     </columnResizePolicy> 
     <columns> 
      <TableColumn fx:id="nameColumn" text="Event Name"/> 
     </columns> 
    </TableView> 
    <HBox spacing="10" alignment="bottom_right" GridPane.columnIndex="1" GridPane.rowIndex="1"> 
     <Button text="Sign In" onAction="#handleSubmitButtonAction"/> 
    </HBox> 
</GridPane> 
Смежные вопросы