填写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 ObservableListdata = 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
这段代码会给我一个错误:
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)
我想不出这个奇怪错误的原因.我也搜索了很长时间并尝试了很多东西,但它仍然出现在启动时.
现在我指望你,社区,请帮助我!
提前感谢阅读长篇文章..
你有
dateCol.setCellFactory(...);
代替
dateCol.setCellValueFactory(...);
这是一个很好的例子,说明为什么你不应该在你的代码中使用原始类型,并且应该避免使用类似PropertyValueFactory
安全代码的API .
即你有
TableView table ; TableColumn dateCol ;
什么时候应该有类似的东西
TableViewtable ; TableColumn dateCol ;
然后你就可以做到
dateCol.setCellValueFactory(cellData -> cellData.getValue().getDate());
如果你这样编码,编译器会立即发现你的错误.
作为旁白(也许,另外一个),你应该让你的Event
类遵循正确的JavaFX Properties模式,如教程中所述.如果不这样做,您可能会看到意外行为.