当前位置:  开发笔记 > 编程语言 > 正文

javafx.scene.control.TableColumn无法强制转换为javafx.scene.control.TableColumn $ CellDataFeatures

如何解决《javafx.scene.control.TableColumn无法强制转换为javafx.scene.control.TableColumn$CellDataFeatures》经验,为你挑选了1个好方法。

填写javafx tableview时遇到问题.

我目前正在开发一个基于GUI的事件管理工具(用于大学),我不得不尝试填充Tableview列表,它应该位于边框窗格布局的中心.

这是我的代码(很长时间以来,它是主窗口函数):

import java.sql.Date;
import java.sql.SQLException;
import java.util.List;

//--main imports--//
import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
//--table imports--//
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.TableColumn;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class MainWindow extends Application {


private static Label tableHeadline;
private static TableView table;
private static TableColumn dateCol;
private static TableColumn nameCol;
private static TableColumn numberOfGuestsCol;
private static TableColumn locationCol;

private static BorderPane layout;

//This is just some test data, this is where the program crashes, I think
final static ObservableList data =  FXCollections.observableArrayList(
        new Event("Jacob", "Smith", 30, new Date(10000))
        );
//----------------------//

//--Private constants--//   
private static final String DATE = "Date";
private static final String NAME = "Name";
private static final String NUMBER_OF_GUESTS = "Number of guests";
private static final String LOCATION = "Location";
//---------------------//


/**The main method, launching the application*/
public static void main(String[] args) {
    try {
    //--launching the application with given arguments--//
    launch(args);}
    catch (Exception e) {e.printStackTrace();}
}

/**
 * The start-method, that is called first when 'launch' is used
 */
@Override
public void start(Stage primaryWindow) throws Exception {

    //--initialize all the objects in the window--//
    initializeObjects();

    //--get the layout--//
    initializeLayout();

    //--give functionality to the objects in the window--//
    functionalizeObjects();

    //--create the new scene--//
    Scene main = new Scene(layout);

    //--Giving the main window a title and bringing it up front--//
    primaryWindow.setMinHeight(DEFAULT_WIN_HEIGHT);
    primaryWindow.setMinWidth(DEFAULT_WIN_WIDTH);
    primaryWindow.setScene(main);
    primaryWindow.show();

    //TODO: on window close, save the content of the list to the db
    primaryWindow.setOnCloseRequest(null);
}


/**
 * Initializes all given elements of the main window by creating and naming them
 */
private static void initializeObjects () {
    //--table--//
    tableHeadline = new Label (TABLE_HEAD);
    tableHeadline.setFont(new Font ("Arial", 20));

    table = new TableView<>();

    table.setEditable(true);

    //--date column--//
    dateCol = new TableColumn(DATE);
    dateCol.setCellFactory(
            new PropertyValueFactory<>("Date")
        );

    //--name column--//
    nameCol = new TableColumn(NAME);
    nameCol.setCellValueFactory(
            new PropertyValueFactory<>("name")
        );      

    //--numberOfGuests column--//
    numberOfGuestsCol = new TableColumn(NUMBER_OF_GUESTS);
    numberOfGuestsCol.setMinWidth(150);
    numberOfGuestsCol.setCellValueFactory(
            new PropertyValueFactory<>("Number of Guests")
        );

    //--location column--//
    locationCol = new TableColumn(LOCATION);
    locationCol.setCellValueFactory(
            new PropertyValueFactory<>("location")
        );

        table.setItems(data);
        table.getColumns().addAll(nameCol,locationCol,
                numberOfGuestsCol,dateCol);

    //TODO fill with data from the database
    //--end table--//
}

/**
 * Assign functionality to the elements of the main window
 */
private static void functionalizeObjects () {

    //--new... MenuItem--//
    newMItem.setOnAction(e -> {
        createReturn = CreatePopup.display();

        if (createReturn) {
            //--get the user input--//
            List toCreate = CreatePopup.getInput();

            //--add a new event according to the user input to the list--//
           //This is where new Events should be inserted, but I cannot test this as I do not come that far
            final ObservableListdata = FXCollections.ObservableArrayList(
                    new Event(toCreate(0),toCreate(1),toCreate(2),toCreate(3))
                    );

            }
        }
    });

    });

}

/**
 * Initializes the layout of the main window
 */
private static void initializeLayout() {
    //--Create a new layout--//
    layout = new BorderPane();

    layout.setTop(menuBar);
    layout.setCenter(table);
}

public static class Event {
    private final SimpleStringProperty name;
    private final SimpleStringProperty location;
    private final SimpleIntegerProperty numberOfGuests;
    private final SimpleObjectProperty date;

    private Event(String name, String location, int numOfGuests, Date date) {
        this.name = new SimpleStringProperty(name);
        this.location = new SimpleStringProperty(location);
        this.numberOfGuests = new SimpleIntegerProperty(numOfGuests);
        this.date = new SimpleObjectProperty(date);
    }


    //--------//
    // Getter //
    //--------//

    public SimpleStringProperty getName() {
        return name;
    }

    public SimpleStringProperty getLocation() {
        return location;
    }

    public SimpleIntegerProperty getNumberOfGuests() {
        return numberOfGuests;
    }

    public SimpleObjectProperty getDate() {
        return date;
    }

}

}


这段代码会给我一个错误:

    Exception in Application start method
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: javafx.scene.control.TableColumn cannot be cast to javafx.scene.control.TableColumn$CellDataFeatures
    at javafx.scene.control.cell.PropertyValueFactory.call(PropertyValueFactory.java:98)
    at com.sun.javafx.scene.control.skin.TableRowSkin.getCell(TableRowSkin.java:87)
    at com.sun.javafx.scene.control.skin.TableRowSkin.getCell(TableRowSkin.java:53)
    at com.sun.javafx.scene.control.skin.TableRowSkinBase.createCell(TableRowSkinBase.java:698)
    at com.sun.javafx.scene.control.skin.TableRowSkinBase.recreateCells(TableRowSkinBase.java:692)
    at com.sun.javafx.scene.control.skin.TableRowSkinBase.init(TableRowSkinBase.java:146)
    at com.sun.javafx.scene.control.skin.TableRowSkin.(TableRowSkin.java:64)
    at javafx.scene.control.TableRow.createDefaultSkin(TableRow.java:212)
    at javafx.scene.control.Control.impl_processCSS(Control.java:859)
    at javafx.scene.Parent.impl_processCSS(Parent.java:1272)
    at javafx.scene.Parent.impl_processCSS(Parent.java:1272)
    at javafx.scene.Parent.impl_processCSS(Parent.java:1272)
    at javafx.scene.control.Control.impl_processCSS(Control.java:855)
    at javafx.scene.Node.processCSS(Node.java:9056)
    at javafx.scene.Node.processCSS(Node.java:9049)
    at javafx.scene.Scene.doCSSPass(Scene.java:545)
    at javafx.scene.Scene.access$3600(Scene.java:159)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2392)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$31(Toolkit.java:348)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:347)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:374)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$405(QuantumToolkit.java:319)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$50(GtkApplication.java:139)
    at java.lang.Thread.run(Thread.java:745)

我想不出这个奇怪错误的原因.我也搜索了很长时间并尝试了很多东西,但它仍然出现在启动时.

现在我指望你,社区,请帮助我!

提前感谢阅读长篇文章..



1> James_D..:

你有

dateCol.setCellFactory(...);

代替

dateCol.setCellValueFactory(...);

这是一个很好的例子,说明为什么你不应该在你的代码中使用原始类型,并且应该避免使用类似PropertyValueFactory安全代码的API .

即你有

TableView table ;
TableColumn dateCol ;

什么时候应该有类似的东西

TableView table ;
TableColumn dateCol ;

然后你就可以做到

dateCol.setCellValueFactory(cellData -> cellData.getValue().getDate());

如果你这样编码,编译器会立即发现你的错误.

作为旁白(也许,另外一个),你应该让你的Event类遵循正确的JavaFX Properties模式,如教程中所述.如果不这样做,您可能会看到意外行为.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有