javafx tableview没有填充

时间:2018-05-04 02:24:34

标签: javafx tableview fxml

我的JavaFX表视图未显示测试数据:

main screen

主要代码:

www.pornhub.com

控制器代码:

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);
}

}

ps:在调试中可以看到contatos列表正确填充了!

Contato Model Class:

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;
}

}

我的FXML文件:

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);
}
}

问题: 1.是否需要在FXML文件中添加有关Observable列表的一些信息? 2.是否需要使ObservableLsit最终? 3.只在表格视图中添加列表,才能在列表和表格视图之间建立链接?

因为我尝试了这一切并且没有任何改变......:[

非常感谢!

1 个答案:

答案 0 :(得分:0)

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。两个地方都应使用相同的名称。