java.lang.reflect.InvocationTargetException JavaFX TableView

时间:2018-06-07 18:27:03

标签: java javafx

我在尝试使用cellData时遇到了这个问题 - > cellData.getValue()从一个对象添加一个属性,该属性是一个StringProperty,我有一个返回它的方法,我在cellData中使用它 - > cellData.getValue()。methodtoreturnproperty,但它仍然给我java.lang.reflect.InvocationTargetException,有谁知道我做错了什么? 这是代码:

barData

有一个名为Sala的类,它被导入到这个控制器中,我可以使它与另一个名为Filmes的类一起工作,我不知道为什么它不适用于类Sala,这里是类中的代码:< / p>

ng serve --host 0.0.0.0 --port 8080 --disableHostCheck

编辑:这是错误:

   package projeto.resources;

import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import projeto.Filmes;
import projeto.MainApp;
import projeto.Sala;

public class FilmeOverviewController {

    @FXML
    private TableView<Filmes> filmeTable;
    @FXML
    private TableColumn<Filmes, String> nomeColumn;
    @FXML
    private TableColumn<Filmes, String> categoriaColumn;
    @FXML
    private TableColumn<Filmes, String> salaColumn;

    @FXML
    private Label nomeLabel;
    @FXML
    private Label salaLabel;
    @FXML
    private Label categoriaLabel;
    @FXML
    private Label diretorLabel;
    @FXML
    private Label duracaoLabel;
    @FXML
    private Label protagonistaLabel;
    @FXML
    private Label classificacaoLabel;

    // Reference to the main application.
    private MainApp mainApp;

    public FilmeOverviewController() {
    }

    @FXML
    private void initialize() {
        //Inicia a tableview com tres colunas.
        nomeColumn.setCellValueFactory(cellData -> cellData.getValue().nomeProperty());
        categoriaColumn.setCellValueFactory(cellData -> cellData.getValue().categoriaProperty());
        salaColumn.setCellValueFactory(cellData -> cellData.getValue().numeroProperty());
        // limpando os detalhes
        showFilmeDetails(null);
        // adicionando funcao
        filmeTable.getSelectionModel().selectedItemProperty()
                .addListener((observable, oldValue, newValue) -> showFilmeDetails(newValue));

    }

    public void setMainApp(MainApp mainApp) {
        this.mainApp = mainApp;

        //adiciona uma observable list
        filmeTable.setItems(mainApp.getfilmeDados());
    }

    private void showFilmeDetails(Filmes filme) {
        if (filme != null) {
            nomeLabel.setText(filme.getNome());
            categoriaLabel.setText(filme.getCategoria());
            duracaoLabel.setText(filme.getDuracao());
            protagonistaLabel.setText(filme.getProtagonista());
            classificacaoLabel.setText(filme.getClassificacao());
            diretorLabel.setText(filme.getDiretor());
            salaLabel.setText(filme.getSalaN());
        } else {
            nomeLabel.setText("");
            categoriaLabel.setText("");
            duracaoLabel.setText("");
            protagonistaLabel.setText("");
            classificacaoLabel.setText("");
            diretorLabel.setText("");
            salaLabel.setText("");
        }
    }

    @FXML
    private void handleDeletarFilme() {
        int selectedIndex = filmeTable.getSelectionModel().getSelectedIndex();
        if (selectedIndex >= 0) {
            filmeTable.getItems().remove(selectedIndex);
        } else {
            Alert alerta = new Alert(AlertType.WARNING);
            alerta.setTitle("Nenhum filme selecionado");
            alerta.setHeaderText("Nenhuma Selecao");
            alerta.setContentText("Por favor selecione um filme para deletar");
            alerta.showAndWait();
        }

    }

    @FXML
    private void handleNovoFilme() {
        Filmes tempFilme = new Filmes("Nome","Categoria");
        boolean clicado = mainApp.showEditarFilmeDialog(tempFilme);
        if (clicado) {
            mainApp.getfilmeDados().add(tempFilme);
        }

    }

    @FXML
    private void handleEditarFilme() {
        Filmes filmeSelecionado = filmeTable.getSelectionModel().getSelectedItem();
            if(filmeSelecionado != null) {
                boolean clicado = mainApp.showEditarFilmeDialog(filmeSelecionado);
                if(clicado) {
                    showFilmeDetails(filmeSelecionado);
                }
            }else {
                //se nada for selecionado
                Alert alerta = new Alert(AlertType.WARNING);
                alerta.initOwner(mainApp.getPrimaryStage());
                alerta.setTitle("Nenhuma selecao");
                alerta.setHeaderText("Nenhum filme selecionado");
                alerta.setContentText("Por favor selecione algum filme.");
                alerta.showAndWait();
            }
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:1)

看起来你期望表中有一种类型的对象,但提供另一种。

您可以像这样定义表格:

@FXML
private TableColumn<Filmes, String> salaColumn;

您的单元格值工厂正在尝试获取以下内容:

salaColumn.setCellValueFactory(cellData -> cellData.getValue().numeroProperty());

numeroProperty在Sala对象上,而不是Filmes对象。

尝试以下方法(虽然我不是100%肯定,因为您对Filmes的定义不在问题中):

salaColumn.setCellValueFactory(cellData -> cellData.getValue().getSala().numeroProperty());

此外 - 如果Sala对象可能为null,您将在尝试访问numeroProperty()之前检查该对象。