2013-08-28 19 views
15

Tôi bắt đầu học javaFX và tôi cần điền một bảng với dữ liệu từ cơ sở dữ liệu của tôi. Tôi đã đọc rất nhiều mã trực tuyến, nhưng tôi đã không tìm thấy những gì tôi đang tìm kiếm. Tôi đọc this nhưng tôi không biết cách triển khai hàm cuối cùng đó. Tôi đọc một số mã khác để làm điều đó và cho đến nay đây là một số mã của tôi:Điền một khung nhìn sử dụng cơ sở dữ liệu trong JavaFX

@FXML private TableView<User> table; 
@FXML private TableColumn<User, String> nameCol; 
@FXML private TableColumn<User, String> emailCol; 
private ObservableList<User> data; 

public void initialize(URL location, ResourceBundle resources) { 
    nameCol.setCellValueFactory(new PropertyValueFactory(“name”)); 
    emailCol.setCellValueFactory(new PropertyValueFactory(“email”)); 
    buildData(); 
} 
public void buildData() { 
     Connection connect = new Connection(); 
     Statement st = connect.Connect(); 
     data = FXCollections.observableArrayList(); 
     try { 
      ResultSet rs = st.executeQuery("SELECT * FROM USER"); 
      while (rs.next()) { 
       ObservableList<User> row = FXCollections.observableArrayList(); 
       for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { 
        row.add(rs.getString(i)); 
        System.out.println(row); 
       } 
       data.add(pol); 
      } 
      tabla.setItems(data);   
     } catch (SQLException ex) { 
      JOptionPane.showMessageDialog(null, ex); 
     } 
} 

Tôi hy vọng bạn có thể giúp tôi

+0

Đây là [mẫu] (https://gist.github.com/jewelsea/4957967) mà [lấy tên từ Cơ sở dữ liệu vào một ListView] (http://stackoverflow.com/questions/14878788/javafx- background-thread-for-sql-query). Khái niệm này tương tự để điền một TableView từ một cơ sở dữ liệu. [Hướng dẫn TableView] (http://docs.oracle.com/javafx/2/ui_controls/table-view.htm) có thể hữu ích, nếu bạn chưa nghiên cứu nó). – jewelsea

+0

bản sao có thể có của [Hiển thị các mục từ Cơ sở dữ liệu trong một khung nhìn JavaFX] (http://stackoverflow.com/questions/16228502/display-items-from-a-database-in-a-javafx-tableview) – jewelsea

Trả lời

21

Tôi chắc chắn điều này sẽ giúp bạn:

public class DBClass{  
    public Connection getConnection() throws ClassNotFoundException, SQLException{  
      Class.forName("com.mysql.jdbc.Driver"); 
      return DriverManager.getConnection("jdbc:mysql://192.168.0.1:3306/dbname","mysqluser","mysqluserpwd"); 
    } 
} 

Trong lớp điều khiển, hãy làm như sau:

@FXML 
void initialize(){ 
    assert tableview != null : "fx:id=\"tableview\" was not injected: check your FXML file 'UserMaster.fxml'."; 
    colUserName.setCellValueFactory(
     new PropertyValueFactory<Usermaster,String>("userName"));   
    colPassword.setCellValueFactory(    
     new PropertyValueFactory<Usermaster,String>("userPassword")); 
    colUserType.setCellValueFactory(
     new PropertyValueFactory<Usermaster,String>("userType"));   
    colPhoto.setCellValueFactory(
     new PropertyValueFactory<Object,ImageView>("userPhoto")); 
    objDbClass = new DBClass(); 
    try{ 
     con = objDbClass.getConnection(); 
     buildData(); 
    } 
    catch(ClassNotFoundException ce){ 
     logger.info(ce.toString()); 
    } 
    catch(SQLException ce){ 
     logger.info(ce.toString()); 
    } 
} 

private ObservableList<Usermaster> data; 

public void buildData(){   
    data = FXCollections.observableArrayList(); 
    try{  
     String SQL = "Select * from usermaster Order By UserName";    
     ResultSet rs = con.createStatement().executeQuery(SQL); 
     while(rs.next()){ 
      Usermaster cm = new Usermaster(); 
      cm.userId.set(rs.getInt("UserId"));      
      Image img = new Image("tailoring/UserPhoto/User"+cm.getUserId().toString()+".jpg");     

      ImageView mv = new ImageView(); 
      mv.setImage(img); 
      mv.setFitWidth(70); 
      mv.setFitHeight(80); 
      cm.userPhoto.set(mv); 
      cm.userName.set(rs.getString("UserName")); 
      cm.userPassword.set(rs.getString("UserPassword")); 
      cm.userType.set(rs.getString("UserType")); 
      data.add(cm);     
     } 
     tableview.setItems(data); 
    } 
    catch(Exception e){ 
      e.printStackTrace(); 
      System.out.println("Error on Building Data");    
    } 
} 

và tạo POJO tệp java riêng biệt cho mọi thực thể (bảng) muốn sử dụng TableView

public class Usermaster{  

    public SimpleIntegerProperty userId = new SimpleIntegerProperty(); 
    public ObjectProperty userPhoto = new SimpleObjectProperty(); 
    public SimpleStringProperty userName = new SimpleStringProperty(); 
    public SimpleStringProperty userPassword = new SimpleStringProperty(); 
    public SimpleStringProperty userType = new SimpleStringProperty(); 
    public SimpleStringProperty encPass = new SimpleStringProperty(); 
    public SimpleStringProperty updt = new SimpleStringProperty(); 
    public SimpleStringProperty uptm = new SimpleStringProperty(); 

    public Integer getUserId() { 
     return userId.get(); 
    } 

    public Object getUserPhoto() { 
     return userPhoto.get(); 
    } 

    public String getUserName() { 
     return userName.get(); 
    } 

    public String getUserPassword() { 
     return userPassword.get(); 
    } 

    public String getUserType() { 
     return userType.get(); 
    } 

    public String getEncPass() { 
     return encPass.get(); 
    } 

    public String getUpdt() { 
     return updt.get(); 
    } 

    public String getUptm() { 
     return uptm.get(); 
    } 
} 

Tôi đã thử nghiệm chương trình này hoạt động hoàn hảo.

+2

Chỉ cần lưu ý ở đây rằng đây không phải là cách được khuyến nghị để tạo lớp mô hình 'Usermaster'; có các thuộc tính 'public' thường là một ý tưởng tồi. Bạn nên tạo các thuộc tính 'private' và cung cấp các phương thức accessor property, cùng với các phương thức' get' và 'set', như trong [ví dụ trong hướng dẫn] (http://docs.oracle.com/javase/8/javafx /properties-binding-tutorial/binding.htm#JFXBD107) –

Các vấn đề liên quan