2016-06-21 35 views
0

我是一个纯粹的新手。我做了我的表用迭代从数据库中添加列:setOnEditCommit with Iteration JavaFX

public void captureDataSuper() { 
    Connection c; 
    ObservableList<ObservableList> data; 
    data = FXCollections.observableArrayList(); 
    try { 
     c = KonekDB.createConnection(); 
     //SQL FOR SELECTING ALL OF CUSTOMER 
     String SQL = "SELECT * from adminsupervisor"; 
     //ResultSet 
     ResultSet rs = c.createStatement().executeQuery(SQL); 

     /** 
     * ******************************** 
     * TABLE COLUMN ADDED DYNAMICALLY * ******************************** 
     */ 
     for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) { 
      //We are using non property style for making dynamic table 
      final int j = i; 
      TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i + 1)); 
      //now its editable 
      col.setCellFactory(TextFieldTableCell.<Adminsupervisor>forTableColumn()); 
      //trying to make effect on database after edited with setOnEditCommit 
      col.setOnEditCommit(
        new EventHandler<CellEditEvent<Adminsupervisor, String>>() { 

       public void handle(CellEditEvent<Adminsupervisor, String> t) { 
        ((Adminsupervisor) t.getTableView().getItems().get(
          t.getTablePosition().getRow())).set(j, t.getNewValue()); 
       } 
      } 
      ); 
      col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() { 
       public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) { 
        return new SimpleStringProperty(param.getValue().get(j).toString()); 
       } 
      }); 

      supervisorTable.getColumns().addAll(col); 
      System.out.println("Column [" + i + "] "); 
     } 

     /** 
     * ****************************** 
     * Data added to ObservableList * ****************************** 
     */ 
     while (rs.next()) { 
      //Iterate Row 
      ObservableList<String> row = FXCollections.observableArrayList(); 
      for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { 
       //Iterate Column 
       row.add(rs.getString(i)); 
      } 
      System.out.println("Row [1] added " + row); 
      data.add(row); 

     } 

     //FINALLY ADDED TO TableView 
     supervisorTable.setItems(data); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Error on Building Data"); 
    } 
    } 

正如你所看到的,我setOnEditCommit完全无感:

col.setOnEditCommit(
       new EventHandler<CellEditEvent<Adminsupervisor, String>>() { 

      public void handle(CellEditEvent<Adminsupervisor, String> t) { 
       ((Adminsupervisor) t.getTableView().getItems().get(
         t.getTablePosition().getRow())).set(j, t.getNewValue()); 
      } 
     } 
     ); 

这是模型类Adminsupervisor:

public class Adminsupervisor { 

private String id; 
private String username; 
private String password; 
private String userType; 

public String getId() { 
    return id; 
} 

public String getUsername() { 
    return username; 
} 

public String getPassword() { 
    return password; 
} 

public String getUserType() { 
    return userType; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public void setUserType(String userType) { 
    this.userType = userType; 
} 

void set(int j, String newValue) { 
    for (j = 0; j < 4; j++) { 
     if (j == 0) { 
      setId(newValue); 
     } 
     if (j == 2) { 
      setPassword(newValue); 
     } 
     if (j == 3) { 
      setUserType(newValue); 
     } 
     if (j == 1) { 
      setUsername(newValue); 
     } 
    } 
    try { 
     Connection c = KonekDB.createConnection(); 

     String SQL = "UPDATE adminsupervisor SET " 
       + "username=" + username + "," 
       + "password=" + password + "," 
       + "userType=" + userType + " WHERE id=" + id + ""; 
     //ResultSet 
     c.createStatement().executeUpdate(SQL); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.out.println("Error on Building Data"); 
    } 
}} 

我得到了这个堆栈跟踪:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: com.sun.javafx.collections.ObservableListWrapper cannot be cast to AdminSide.Adminsupervisor 
at AdminSide.PanelAdmin$1.handle(PanelAdmin.java:275) 
at AdminSide.PanelAdmin$1.handle(PanelAdmin.java:272) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.control.TableCell.commitEdit(TableCell.java:349) 
at javafx.scene.control.cell.CellUtils.lambda$createTextField$615(CellUtils.java:248) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Node.fireEvent(Node.java:8411) 
at com.sun.javafx.scene.control.behavior.TextFieldBehavior.fire(TextFieldBehavior.java:179) 
at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(TextInputControlBehavior.java:178) 
at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(BehaviorBase.java:218) 
at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callActionForEvent(TextInputControlBehavior.java:127) 
at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$74(BehaviorBase.java:135) 
at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
at javafx.event.Event.fireEvent(Event.java:198) 
at javafx.scene.Scene$KeyHandler.process(Scene.java:3964) 
at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3910) 
at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2040) 
at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2501) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:197) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:147) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$353(GlassViewEventHandler.java:228) 
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:227) 
at com.sun.glass.ui.View.handleKeyEvent(View.java:546) 
at com.sun.glass.ui.View.notifyKey(View.java:966) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
at java.lang.Thread.run(Thread.java:745) 

所以我的单元格在编辑提交后不会做任何事情。

+0

看一看你的堆栈跟踪,并在第一行说,你尝试“ObservableListWrapper”转换为你的模型类“AdminSide.Adminsupervisor”。你确定,你的DATA对象是一个ObservableList的ObservableList,还是你想拥有一个AdminSide.Adminsupervisor的ObservableList? 'ObservableList '? – SSchuette

+1

@SSchuette是的我想让Adminsupervisor与ObservableList的类型相同,因此我可以将它包装成没有问题。你愿意告诉我该怎么办? –

+0

“我想让'Adminsupervisor'与'ObservableList'类型相同?这些(非常)不同的类型 - 你不能假装它们是同一件事。您需要确定表格的每一行代表什么类型,并坚持下去。如果你想让它成为'Adminsupervisor',那么把'data'变成'ObservableList '并且添加适当的对象。如果你希望它是'ObservableList'(应该是'ObservableList '),那么完全删除'Adminsupervisor'类并且只使用'ObservableList'。第一个更好,恕我直言,但你需要选择一个。 –

回答

1

data被声明为ObservableList<ObservableList> data;和你ObservableList个饱吧:

while (rs.next()) { 
    //Iterate Row 
    ObservableList<String> row = FXCollections.observableArrayList(); 
    ... 
    data.add(row); 
} 

onEditCommit处理你这样做不过:

public void handle(CellEditEvent<Adminsupervisor, String> t) { 
    ((Adminsupervisor) t.getTableView().getItems().get(
      t.getTablePosition().getRow())).set(j, t.getNewValue()); 
} 

t.getTableView().getItems().get(index)返回ObservableList,你试着投到Adminsupervisor由于显而易见的原因不起作用...

您需要为项目和处理程序使用相同的类型。无论您是想用ObservableListAdminsupervisor是你......

注:添加类型参数的TableViewTableColumn,编译器应该抱怨。但是,通过使用原始类型,您可以阻止编译器执行这些检查(尽管您可能会收到关于原始类型的警告)。

此外

for (j = 0; j < 4; j++) { 
    if (j == 0) { 
     setId(newValue); 
    } 
    if (j == 2) { 
     setPassword(newValue); 
    } 
    if (j == 3) { 
     setUserType(newValue); 
    } 
    if (j == 1) { 
     setUsername(newValue); 
    } 
} 

应当rewrittern作为

setId(newValue); 
setUsername(newValue); 
setPassword(newValue); 
setUserType(newValue); 

j = 4; // not really neccessary since there is no read access to j 

至少能实现相同的效果。 (但也许你刚刚添加围绕这些if S中for循环无缘无故,它应该被删除。)

而且还考虑取消jAdminsupervisor.set方法的参数,因为值永远不会在方法中(原版本在for (j = 0; j < 4; j++)发生任何读取访问之前被0覆盖,在改进的版本中它根本不被读取)。

此外,您的cellValueFactory返回的ObservableValue永远不会触发更新。如果您使用ObservableList作为项目类型,你可以使用Bindings类来获得一个ObservableValue特定指数:

col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() { 
    public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) { 
     return Bindings.stringValueAt(param.getValue(), j); 
    } 
}); 
+0

谢谢先生,但我需要解决方案而不是判断。 –

+1

@SuryaHardiansyah:然后只需将'Adminsupervisor's添加为项目,或者将其替换为'ObservableList'。我认为这一点很明显,一旦问题得到解释... – fabian

+0

如何做到这一点先生? :“( 请告诉我我应该在 –