2017-04-23 4 views
0

내 컨트롤러 클래스에서 table (TableView 변수)을 참조하는 내 view.fxml에서 tableview를 만들었습니다. showFilesTableView()initialize() 방법으로 호출됩니다.java.lang.ClassCastException 데이터 클래스로 TableView 채우기

public void showFilesTableView() { 

    TableColumn Name = new TableColumn<AllInfo,String>("Name"); 
    Name.setCellFactory(new PropertyValueFactory<AllInfo, String>("name")); 
    table.getColumns().add(Name); 

    TableColumn Size = new TableColumn<AllInfo,String>("Size"); 
    Size.setCellFactory(new PropertyValueFactory<AllInfo, String>("size")); 
    table.getColumns().add(Size); 

    TableColumn dmd = new TableColumn<AllInfo,String>("Date Modified"); 
    dmd.setCellFactory(new PropertyValueFactory<AllInfo, String>("date")); 
    table.getColumns().add(dmd); 

    ObservableList<AllInfo> data= FXCollections.observableArrayList(); 
    File[] files = (new File(textfield.getText())).listFiles(); 

    for(File f: files) { 

     AllInfo obj = new AllInfo(); 
     obj.name.set(f.getName()); 
     obj.size.set(String.valueOf(f.length())); 
     obj.date.set(String.valueOf(f.lastModified())); 

     data.add(obj); 

    } 
    table.setItems(data); 
} 

AllInfo 클래스는 다음과 같습니다

public class AllInfo { 

    public SimpleStringProperty name = new SimpleStringProperty(); 
    public SimpleStringProperty size = new SimpleStringProperty(); 
    public SimpleStringProperty date = new SimpleStringProperty(); 
} 

그러나이 오류는 모든 시간을 보여주고있다 ....

java.lang.ClassCastException: javafx.scene.control.TableColumn cannot be cast to javafx.scene.control.TableColumn$CellDataFeatures 

전체 오류 : 내가 가지고있는

Exception in Application start method 
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: 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:872) 
    at javafx.scene.Node.processCSS(Node.java:9056) 
    at javafx.scene.Node.applyCss(Node.java:9153) 
    at com.sun.javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1964) 
    at com.sun.javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1797) 
    at com.sun.javafx.scene.control.skin.VirtualFlow.getCellLength(VirtualFlow.java:1879) 
    at com.sun.javafx.scene.control.skin.VirtualFlow.computeViewportOffset(VirtualFlow.java:2528) 
    at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1189) 
    at javafx.scene.Parent.layout(Parent.java:1087) 
    at javafx.scene.Parent.layout(Parent.java:1093) 
    at javafx.scene.Parent.layout(Parent.java:1093) 
    at javafx.scene.Scene.doLayoutPass(Scene.java:552) 
    at javafx.scene.Scene.preferredSize(Scene.java:1646) 
    at javafx.scene.Scene.impl_preferredSize(Scene.java:1720) 
    at javafx.stage.Window$9.invalidated(Window.java:846) 
    at javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:109) 
    at javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:144) 
    at javafx.stage.Window.setShowing(Window.java:922) 
    at javafx.stage.Window.show(Window.java:937) 
    at javafx.stage.Stage.show(Stage.java:259) 
    at sample.Main.start(Main.java:18) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
    ... 1 more 

시도했습니다 this하지만 여전히 오류가 발생합니다 ng.

이 문제를 해결하는 방법?

답변

2

cellValueFactory 대신 PropertyValueFactorycellFactory으로 사용하고 있습니다.

원시 유형을 사용 중이므로 Callback의 유형 매개 변수가 올바른지 컴파일러에서 확인할 수 없으므로 컴파일 시간 오류가 발생합니다. TableColumn 선언에 유형 매개 변수를 추가 더 나은

Size.setCellValueFactory(new PropertyValueFactory<AllInfo, String>("size")); 
... 

과 :

TableColumn<AllInfo, String> Size = ... 
... 

또한 필드는 항목 클래스에 포함되는

간단하게이 문제를 해결하려면 코드에서 setCellValueFactorysetCellFactory 교체 데이터를 표시하기에는 부족합니다. PropertyValueFactory은이 경우 속성 nameProperty(), sizePropertydateProperty을 반환하는 메소드를 찾습니다.