2016-05-04 5 views
1

Я новичок в JavaFX. Я пытался создать образец приложения для управления колледжей, где у меня есть панель инструментов (dashboard.fxml) с табличным представлением для заполнения данных студента.Как перезагрузить табличное представление JavaFX после вставки новых данных?

Существует кнопка, которая загружает окно ввода данных студентов (newStduent.fxml) и сохраняет в базе данных. Мне нужно автоматически перезагружать таблицу после того, как данные будут вставлены в таблицу.

После код обрабатывает событие внутри Controller.java, который загружает другой FXML файл newStudent.fxml, который обрабатывается AdmissionController.java

public void buildData(String SQL) 
    { 
     data = FXCollections.observableArrayList(); 
     try { 
      ResultSet rs = connection.createStatement().executeQuery(SQL); 
      while(rs.next()) 
      { 
       StudentMaster studentData = new StudentMaster(); 
       studentData.studentId.set(rs.getInt("student_id")); 
       studentData.stdClass.set(rs.getString("student_std")); 
       studentData.name.set(rs.getString("student_name")); 
       studentData.admNo.set(rs.getString("student_admn_no")); 
       studentData.regno.set(rs.getString("student_regno")); 
       studentData.stdDiv.set(rs.getString("student_div")); 
       data.add(studentData); 
       studentTable.setItems(data); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    @FXML 
    void initialize() { 
     assert studentTable != null : "fx:id=\"studentTable\" was not injected: check your FXML file 'dashboard.fxml'."; 
     assert studID != null : "fx:id=\"studID\" was not injected: check your FXML file 'dashboard.fxml'."; 
     assert studReg != null : "fx:id=\"studReg\" was not injected: check your FXML file 'dashboard.fxml'."; 
     assert stdAdm != null : "fx:id=\"stdAdm\" was not injected: check your FXML file 'dashboard.fxml'."; 
     assert stdName != null : "fx:id=\"stdName\" was not injected: check your FXML file 'dashboard.fxml'."; 
     assert stdClass != null : "fx:id=\"stdClass\" was not injected: check your FXML file 'dashboard.fxml'."; 
     assert stdDiv != null : "fx:id=\"stdDiv\" was not injected: check your FXML file 'dashboard.fxml'."; 

     loadDataToTable(); 

     DatabaseAccess newConnection = new DatabaseAccess(); 
     connection = newConnection.startConnection(); 
     String SQL = "Select * from student"; 
     buildData(SQL); 
     newConnection.shutdown(); 

    } 

    private void loadDataToTable() 
    { 
     studID.setCellValueFactory(new PropertyValueFactory<StudentMaster, Integer>("studentId")); 
     studReg.setCellValueFactory(new PropertyValueFactory<StudentMaster, String>("regno")); 
     stdName.setCellValueFactory(new PropertyValueFactory<StudentMaster, String>("name")); 
     stdAdm.setCellValueFactory(new PropertyValueFactory<StudentMaster, String>("admNo")); 
     stdClass.setCellValueFactory(new PropertyValueFactory<StudentMaster, String>("stdClass")); 
     stdDiv.setCellValueFactory(new PropertyValueFactory<StudentMaster, String>("stdDiv")); 
    } 

    @FXML 
    void createStudent(ActionEvent event) 
    { 
     FXMLLoader fxmlLoader; 
     fxmlLoader = new FXMLLoader(getClass().getResource("/resources/fxml/newStudent.fxml")); 
     try { 
      Parent root1 = (Parent)fxmlLoader.load(); 
      Stage stage = new Stage(); 
      stage.initModality(Modality.APPLICATION_MODAL); 
//   stage.initStyle(StageStyle.UNDECORATED); 
      stage.setTitle("New Admission"); 
      stage.setScene(new Scene(root1)); 
      stage.show(); 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    @FXML 
    void searchBtnClicked(ActionEvent event) 
    { 
     String name = nameBox.getText(); 
     String regno = regBox.getText(); 
     String admno = admBox.getText(); 
     String stdClass = classBox.getText(); 

     String SQL = "Select * from student where student_name like '"+name+"%'"; 
     System.out.println(SQL); 
     DatabaseAccess newConnection = new DatabaseAccess(); 
     connection = newConnection.startConnection(); 
     buildData(SQL); 
     newConnection.shutdown(); 
     loadDataToTable(); 
    } 

    public void reloadStudentTable() 
    { 
     loadDataToTable(); 
    } 

} 

AdmissionController.java

Следующее событие обрабатывает ввод данных и закрывает окно, но после вставки оно не обновляет вид таблицы.

@FXML 
    void doneBtnClicked(ActionEvent event) 
    { 
     String name = nameBox.getText(); 
     String SQLquery = "INSERT INTO student (student_name) VALUES ('"+name+"')"; 
     ExecuteSQL newQuery = new ExecuteSQL(); 
     Boolean executeStatus = newQuery.ExecuteSQL(SQLquery); 
     System.out.println(executeStatus ? "Data Inserted" : "Error in execution");  


     //  Close the Window after successfully inserted 

     Node node = (Node)event.getSource(); 
     Stage stage = (Stage)node.getScene().getWindow(); 
     stage.close(); 
    } 

Я пытался вызвать reloadStudentTable() метод внутри Controller.java как этот

Controller reloadData = new Controller(); 
reloadData.reloadStudentTable(); 

Но генерировать некоторые ошибки, как это.

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657) 
    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.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 javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    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.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$MouseHandler.process(Scene.java:3757) 
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388) 
Data Inserted 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
    at com.sun.glass.ui.View.notifyMouse(View.java:937) 
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) 
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275) 
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769) 
    ... 48 more 
Caused by: java.lang.NullPointerException 
    at dashboard.Controller.loadDataToTable(Controller.java:132) 
    at dashboard.Controller.reloadStudentTable(Controller.java:178) 
    at dashboard.AdmissionController.doneBtnClicked(AdmissionController.java:72) 
    ... 58 more 
+0

Опубликовать полную трассировку стека. Ваш метод loadDataToTable должен выполняться только один раз (из метода 'initialize()': вызов его снова не делает ничего нового). И как только вы манипулируете данными (например, добавьте больше элементов в список), нет необходимости обновлять таблицу, она будет обновляться автоматически. Но, не увидев полную трассировку стека, и вы сообщаете нам, какая строка вызывает ошибку, никто не может действительно помочь. –

+0

@James_D Извините, я обновил полную трассировку стека. Надеюсь, я получу помощь. – nitroman

ответ

5

@FXML В -annotated поля в контроллере инициализируются FXMLLoader, когда он загружает FMXL. Если вы создаете новый экземпляр контроллера вручную (т. Е. Controller reloadData = new Controller();), то, очевидно, эти поля не будут инициализированы в этом экземпляре контроллера.

В любом случае не нужно называть метод reloadStudentTable. Все, что он делает, это настроить столбцы, чтобы они знали, какие данные должны отображаться; вам не нужно делать это более одного раза. Все, что вам нужно сделать, это добавить новый студент в список данных таблицы:

data.add(new StudentMaster(...)); 

Для того, чтобы сделать это, вам просто нужно AdmissionController иметь ссылку на данные:

public class AdmissionController { 

    private ObservableList<StudentMaster> data ; 

    public void setStudentData(ObservableList<StudentMaster> data) { 
     this.data = data ; 
    } 

    // existing code... 

    @FXML 
    void doneBtnClicked(ActionEvent event) 
    { 
     String name = nameBox.getText(); 
     String SQLquery = "INSERT INTO student (student_name) VALUES ('"+name+"')"; 
     ExecuteSQL newQuery = new ExecuteSQL(); 
     boolean executeStatus = newQuery.ExecuteSQL(SQLquery); 
     System.out.println(executeStatus ? "Data Inserted" : "Error in execution");  

     if (executeStatus) { 
      StudentMaster student = new StudentMaster(...); 
      data.add(student); 
     } 

     //  Close the Window after successfully inserted 

     Node node = (Node)event.getSource(); 
     Stage stage = (Stage)node.getScene().getWindow(); 
     stage.close(); 
    } 

    // ... 
} 

И то в вашем основном контроллере выполните:

@FXML 
void createStudent(ActionEvent event) 
{ 
    FXMLLoader fxmlLoader; 
    fxmlLoader = new FXMLLoader(getClass().getResource("/resources/fxml/newStudent.fxml")); 
    try { 
     Parent root1 = (Parent)fxmlLoader.load(); 

     AdmissionController admissionController = fxmlLoader.getController(); 
     admissionController.setStudentData(studentTable.getItems()); 

     Stage stage = new Stage(); 
     stage.initModality(Modality.APPLICATION_MODAL); 
     stage.setTitle("New Admission"); 
     stage.setScene(new Scene(root1)); 
     stage.show(); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 
+0

Спасибо, человек! Я искал это в течение нескольких дней! Работал как шарм! – xadun

Смежные вопросы