gpt4 book ai didi

javafx.scene.control.TableColumn 不能转换为 javafx.scene.control.TableColumn$CellDataFeatures

转载 作者:行者123 更新时间:2023-12-01 12:06:19 30 4
gpt4 key购买 nike

我在填充 javafx tableview 时遇到问题。

我目前正在开发基于 GUI 的事件管理工具(适用于大学),但我一直在尝试填充 Tableview 列表,该列表应该位于边框 Pane 布局的中心。

这是我的代码(它的想法很长,它的主窗口函数):

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<Event> 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<Event, Date>(DATE);
dateCol.setCellFactory(
new PropertyValueFactory<>("Date")
);

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

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

//--location column--//
locationCol = new TableColumn<Event, String>(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<Object> 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 ObservableList<Event>data = 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> 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>(date);
}


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

public SimpleStringProperty getName() {
return name;
}

public SimpleStringProperty getLocation() {
return location;
}

public SimpleIntegerProperty getNumberOfGuests() {
return numberOfGuests;
}

public SimpleObjectProperty<Date> 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.<init>(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。支持类型安全代码。

IE。你有
TableView table ;
TableColumn dateCol ;

当你应该有类似的东西
TableView<Event> table ;
TableColumn<Event, Date> dateCol ;

然后你可以做
dateCol.setCellValueFactory(cellData -> cellData.getValue().getDate());

如果您以这种方式编码,编译器会立即发现您的错误。

顺便说一句(也许,另一边),你真的应该让你的 Event类遵循正确的 JavaFX 属性模式,如 tutorial 中所述.如果不这样做,您可能会看到意外行为。

关于javafx.scene.control.TableColumn 不能转换为 javafx.scene.control.TableColumn$CellDataFeatures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32398007/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com