javafx tableview не заполняется - PullRequest
0 голосов
/ 04 мая 2018

В моем табличном представлении JavaFX не отображаются тестовые данные:

главный экран

основной код:

package javafxapp;

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

public class JavaFXApp extends Application {

@Override
public void start(Stage stage) throws Exception {
    Parent root = 
FXMLLoader.load(getClass().getResource("view/FXMLCatalogo.fxml"));

    Scene scene = new Scene(root);

    stage.setScene(scene);
    stage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

Код контроллера:

package javafxapp.controller;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafxapp.model.Contato;

/**
 *
 * @author 
 */
public class FXMLCatalogoController implements Initializable {

    private final ObservableList<Contato> contatos =             
        FXCollections.observableArrayList();

@FXML
private Label labelNome, labelSobrenome, labelCidade, 
        labelEstado, labelCep, labelDataNasc;

@FXML
private TableView<Contato> tableContato = new TableView<>();

@FXML
private TableColumn<Contato, String> columnNome = new TableColumn<>("Nome");
private TableColumn<Contato, String> columnSobrenome = new TableColumn<>("Sobrenome");

@Override
public void initialize(URL url, ResourceBundle rb) {
    columnNome.setCellValueFactory(cellData -> cellData.getValue().nomeProperty());
    columnSobrenome.setCellValueFactory(cellData -> cellData.getValue().sobrenomeProperty());
    tableContato.setItems(getItems());
    tableContato.getColumns().addAll(columnNome, columnSobrenome);
}    

public ObservableList<Contato> getItems() {
    contatos.add(new Contato("Henrique 1", "Rosa", "São Paulo", "SP", "08285140", "22/08/1990"));
    contatos.add(new Contato("Henrique 2", "Rosa", "Rio Janeiro", "RJ", "08285140", "22/08/1991"));
    contatos.add(new Contato("Henrique 3", "Rosa", "Belo Horizont", "MG", "08285140", "22/08/1992"));
    contatos.add(new Contato("Henrique 4", "Rosa", "São Caetano do Sul", "SP", "08285140", "22/08/1993"));
    contatos.add(new Contato("Henrique 5", "Rosa", "Diadema", "SP", "08285140", "22/08/1994"));
    contatos.add(new Contato("Henrique 6", "Rosa", "Osasco", "SP", "08285140", "22/08/1994"));
    contatos.add(new Contato("Henrique 7", "Rosa", "Guarulhos", "SP", "08285140", "22/08/1995"));
    contatos.add(new Contato("Henrique 8", "Rosa", "São Paulo", "SP", "08285140", "22/08/1996"));
    contatos.add(new Contato("Henrique 9", "Rosa", "São Paulo", "SP", "08285140", "22/08/1997"));
    contatos.add(new Contato("Henrique 10", "Rosa", "São Paulo", "SP", "08285140", "22/08/1998"));
    return contatos;
}

}

ps: в отладке можно сделать так, чтобы список контатов правильно заполнился!

Класс модели Contato:

package javafxapp.model;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;


public class Contato {

private final StringProperty nome;
private final StringProperty sobrenome;
private final StringProperty cidade;
private final StringProperty estado;
private final StringProperty cep;
private final StringProperty dtNasc;

public Contato(String nome, String sobrenome, String cidade, String estado, String cep, String dtNasc) {
    this.nome = new SimpleStringProperty(nome);
    this.sobrenome = new SimpleStringProperty(sobrenome);
    this.cidade = new SimpleStringProperty(cidade);
    this.estado = new SimpleStringProperty(estado);
    this.cep = new SimpleStringProperty(cep);
    this.dtNasc = new SimpleStringProperty(dtNasc);
}

public String getNome() {
    return nome.get();
}

public void setNome(String nome) {
    this.nome.set(nome);
}

public StringProperty nomeProperty() {
    return this.nome;
}

public String getSobrenome() {
    return sobrenome.get();
}

public void setSobrenome(String sobrenome) {
    this.sobrenome.set(sobrenome);
}

public StringProperty sobrenomeProperty() {
    return this.sobrenome;
}

public String getCidade() {
    return cidade.get();
}

public void setCidade(String cidade) {
    this.cidade.set(cidade);
}

public String getEstado() {
    return estado.get();
}

public void setEstado(String estado) {
    this.estado.set(estado);
}

public String getCep() {
    return cep.get();
}

public void setCep(String cep) {
    this.cep.set(cep);
}

public String getDtNasc() {
    return dtNasc.get();
}

public void setDtNasc(String dtNasc) {
    this.dtNasc.set(dtNasc);
}
}

Мой файл FXML:

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

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>

<AnchorPane id="AnchorPane" prefHeight="300.0" prefWidth="639.0" 
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="javafxapp.controller.FXMLCatalogoController">
   <children>
      <SplitPane dividerPositions="0.5100334448160535" layoutX="-3.0" 
prefHeight="300.0" prefWidth="647.0" AnchorPane.bottomAnchor="0.0" 
AnchorPane.leftAnchor="-3.0" AnchorPane.rightAnchor="-5.0" 
AnchorPane.topAnchor="0.0">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="298.0" 
prefWidth="322.0">
               <children>
                  <TableView fx:id="tabelaContato" editable="true" 
layoutX="-14.0" prefHeight="298.0" prefWidth="336.0" 
tableMenuButtonVisible="true" AnchorPane.bottomAnchor="0.0" 
AnchorPane.leftAnchor="-14.0" AnchorPane.rightAnchor="0.0" 
AnchorPane.topAnchor="0.0">
                    <columns>
                      <TableColumn fx:id="columnNome" prefWidth="75.0" 
text="Nome" />
                      <TableColumn fx:id="columnSobrenome" prefWidth="75.0" 
text="Sobrenome" />
                    </columns>
                     <columnResizePolicy>
                        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" 
/>
                     </columnResizePolicy>
                  </TableView>
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="298.0" 
prefWidth="251.0">
               <children>
              <Label layoutX="24.0" layoutY="-7.0" prefHeight="57.0" prefWidth="162.0" text="Person Details" AnchorPane.leftAnchor="10.0">
                 <font>
                    <Font size="18.0" />
                 </font>
              </Label>
              <GridPane layoutX="30.0" layoutY="48.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="50.0">
                 <columnConstraints>
                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
                    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                 </columnConstraints>
                 <rowConstraints>
                    <RowConstraints minHeight="25.0" vgrow="SOMETIMES" />
                    <RowConstraints minHeight="25.0" vgrow="SOMETIMES" />
                    <RowConstraints minHeight="25.0" vgrow="SOMETIMES" />
                    <RowConstraints minHeight="25.0" vgrow="SOMETIMES" />
                    <RowConstraints minHeight="25.0" vgrow="SOMETIMES" />
                    <RowConstraints minHeight="25.0" vgrow="SOMETIMES" />
                 </rowConstraints>
                 <children>
                    <Label text="Nome:" />
                    <Label text="Sobrenome:" GridPane.rowIndex="1" />
                    <Label text="Cidade:" GridPane.rowIndex="2" />
                    <Label text="Estado:" GridPane.rowIndex="3" />
                    <Label text="CEP:" GridPane.rowIndex="4" />
                    <Label text="Data Nasc.:" GridPane.rowIndex="5" />
                    <Label fx:id="labelNome" GridPane.columnIndex="1" />
                    <Label fx:id="labelSobrenome" GridPane.columnIndex="1" GridPane.rowIndex="1" />
                    <Label fx:id="labelCidade" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                    <Label fx:id="labelEstado" GridPane.columnIndex="1" GridPane.rowIndex="3" />
                    <Label fx:id="labelCep" GridPane.columnIndex="1" GridPane.rowIndex="4" />
                    <Label fx:id="labelDataNasc" GridPane.columnIndex="1" GridPane.rowIndex="5" />
                 </children>
              </GridPane>
                <Button layoutX="22.0" layoutY="259.0" mnemonicParsing="false" text="Novo" />
                <Button layoutX="133.0" layoutY="259.0" mnemonicParsing="false" text="Editar" />
                <Button layoutX="225.0" layoutY="259.0" mnemonicParsing="false" text="Remover" />
              </children></AnchorPane>
    </items>
  </SplitPane>
   </children>
</AnchorPane>

Вопросы: 1. Нужно ли добавить некоторую информацию о списке наблюдаемых в файл FXML? 2. Требуется ли сделать ObservableLsit окончательным? 3. Только добавление списка в просмотр таблицы делает ссылку между списком и просмотром таблицы?

Потому что я все это пробовал, и ничего не изменилось ...: [

Большое спасибо!

1 Ответ

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

После того, как в файле FXML объявлены следующие элементы

<TableView fx:id="tableContato" ... >
    <columns>
        <TableColumn fx:id="columnNome" ... />
        <TableColumn fx:id="columnSobrenome" ... />
    </columns>
</TableView>

тогда ручное создание их экземпляров неверно. Необходимо только объявить элементы (с соответствующей аннотацией)

...
@FXML
private TableView<Contato> tableContato;

@FXML
private TableColumn<Contato, String> columnNome;

@FXML
private TableColumn<Contato, String> columnSobrenome;
...

Следовательно, очевидное добавление столбцов при инициализации должно быть удалено

...
//tableContato.getColumns().addAll(columnNome, columnSobrenome);
...

Вышеуказанные изменения должны работать

В файле FXML таблица имеет идентификатор tabelaContato, а в контроллере вы используете tableContato. В обоих местах должно использоваться одно и то же имя.

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