2015-03-28 5 views
0

Я не могу заполнить свой рабочий стол. Я считаю, что проблема в контроллере, в том, как мои данные отправляются в файл FXML, потому что распечатка системы (см. Ниже) показывает то, что у меня есть в моей базе данных.tableview не отображается данные из базы данных

Сообщите мне, где я совершил ошибку. Я просмотрел все учебники, которые существуют на этом, но ничто не соответствует моей проблеме.

Благодаря

Main App:

package tableview; 


import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class MainApp extends Application { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    launch(args); 
} 

@Override 
public void start(Stage primaryStage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("view/FXMLTable.fxml")); 
    Scene scene = new Scene(root); 
    primaryStage.setScene(scene); 
    primaryStage.show();  
} 
} 

Контроллер:

import tableview.model.Person; 


public class FXMLTableController{ 

@FXML 
public TableView<Person> tableview ; 
@FXML 
private TableColumn<Person, Number> clientIdColumn; 
@FXML 
private TableColumn<Person, String> firstNameColumn; 
@FXML 
private TableColumn<Person, String> lastNameColumn; 

@FXML 
private void initialize() { 
     assert tableview != null : "fx:id=\"tableview\" was not injected: check your FXML file 'UserMaster.fxml'."; 
     clientIdColumn.setCellValueFactory(cellData -> cellData.getValue(). 
       clientIDProperty()); 

     firstNameColumn.setCellValueFactory(cellData -> cellData.getValue() 
       .firstNameProperty());    
     lastNameColumn.setCellValueFactory(cellData -> cellData.getValue() 
       .lastNameProperty()); 

     buildData(); 

    } 

private ObservableList<Person> data; 


public void buildData(){   
    data = FXCollections.observableArrayList(); 
    Connection con = null; 


     try { 
      Class.forName("org.sqlite.JDBC"); 
      con = DriverManager.getConnection("jdbc:sqlite:tableviewdb.db"); 

     String SQL = "Select * from INFO";    
     ResultSet rs = con.createStatement().executeQuery(SQL); 
     while(rs.next()){ 
      Person per = new Person(); 
      per.ClientID.set(rs.getInt("CLIENTID")); 
      per.FirstName.set(rs.getString("FIRSTNAME")); 
      per.LastName.set(rs.getString("LASTNAME")); 

      data.add(per); 

     } 
     tableview = new TableView<Person>(); 
     tableview.setItems(data); 
     System.out.println(tableview.getItems().get(1).ClientID); 
    } 
    catch(Exception e){ 
      e.printStackTrace(); 
      System.out.println("Error on Building Data");    
    } 
    } 
} 

Модель Класс:

package tableview.model; 

import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.SimpleIntegerProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 

public class Person { 
    public SimpleIntegerProperty ClientID = new SimpleIntegerProperty(); 
    public SimpleStringProperty FirstName = new SimpleStringProperty(); 
    public SimpleStringProperty LastName = new SimpleStringProperty(); 

    public SimpleIntegerProperty getClientID() { 
     return ClientID; 
    } 
    public SimpleStringProperty getFirstname() { 
     return FirstName; 
    } 
    public SimpleStringProperty getLastName() { 
     return LastName; 
    } 
    public IntegerProperty clientIDProperty(){ 
     return ClientID; 
    } 
    public StringProperty firstNameProperty(){ 
     return FirstName; 

    } 
    public StringProperty lastNameProperty(){ 
     return LastName;  
    } 
} 

FXML файл: (игнорировать сохранение окурок на сейчас ...)

<?import javafx.scene.control.*?> 
<?import java.lang.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.AnchorPane?> 


<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8"> 
    <children> 
     <SplitPane prefHeight="400.0" prefWidth="600.0"> 
     <items> 
      <SplitPane dividerPositions="0.5" orientation="VERTICAL" prefHeight="200.0" prefWidth="160.0"> 
       <items> 
       <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"> 
        <children> 
         <TextField layoutX="93.0" layoutY="34.0" /> 
         <TextField layoutX="93.0" layoutY="85.0" /> 
         <Label layoutX="35.0" layoutY="39.0" text="name" /> 
         <Label layoutX="35.0" layoutY="90.0" text="email" /> 
         <Button layoutX="204.0" layoutY="140.0" mnemonicParsing="false" text="save" /> 
        </children> 
        </AnchorPane> 
       <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0"> 
        <children> 
         <TableView layoutY="-2.0" prefHeight="200.0" prefWidth="598.0"> 
          <columns> 
          <TableColumn prefWidth="302.0" text="name" /> 
          <TableColumn prefWidth="295.0" text="email" /> 
          </columns> 
         </TableView> 
        </children> 
        </AnchorPane> 
       </items> 
      </SplitPane> 
     </items> 
     </SplitPane> 
    </children> 
</AnchorPane> 

ответ

0

Вы создаете новый TableView и установки его элементов, вместо того, чтобы устанавливать элементы на столе, что файл FXML определен. Удалить

tableView = new TableView<Person>(); 

с контроллера.

Чтобы получить @FXML -annotated поля в контроллере должны быть заполнены соответствующими элементами из файла FXML, вам нужно добавить fx:id атрибуты этих элементов:

<TableView fx:id="tableview" ... > 
    <columns> 
    <TableColumn fx:id="firstNameColumn" ... /> 
    ... 
+0

тогда я получаю нулевой pointerexception ... http://tinypic.com/r/j5xjz5/8 – johnsnow333

+0

Вы забыли атрибуты 'fx: id' в вашем файле FXML. (Если вы запустили его с включенными утверждениями, вы увидите ошибку утверждения.) См. Обновленный ответ. –

+0

потрясающий! это сработало!! Спасибо большое. – johnsnow333

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