2014-04-11 3 views
4

저는 초보자 자바 프로그래머입니다. JavaFX TableView에 ResultSet 데이터를 삽입하고 싶습니다. 그러나 중간 클래스는 사용하지 않습니다. ResultSet 행을 TableView 행에 객체로 삽입 할 수 있습니까? 여기 중급 클래스가없는 JavaFX TableView에 데이터 삽입

중간 수준의 단위를 사용하여 내 코드

public static ObservableList<Unit> getUnits() { 

    final ObservableList<Unit> data = FXCollections.observableArrayList(); 
    if (openConnection()) { 
     try { 
      rs = st.executeQuery("SELECT * FROM units"); 
      while (rs.next()) { 

       data.add(new Unit(rs.getString("id_unit"), 
         rs.getString("short_name"), 
         rs.getString("name"))); 
      } 
     } catch (Exception ex) { 
      Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    closeConnection(); 
    return data; 
} 

컨트롤러

idUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("idUnit")); 
shortNameUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("shortName")); 
nameUnit.setCellValueFactory(new PropertyValueFactory<Unit, String>("name")); 

unitsTableView.setItems(SQLConnect.getUnits()); 

답변

3

데이터를 저장할 항목이 필요합니다. "중급 클래스"라고하는 무언가가 TableView의 데이터 유형이 될 것입니다.

꼭 필요한 클래스 일 필요는 없지만 일반적인 것을 사용하는 경우 코드가 훨씬 이해하기 어려울 것입니다.

TableView<List<String>> unitsTableView = new TableView<>(); 
idUnit = new TableColumn<List<String>, String>("Id"); 
idUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, ObservableValue<String>>() { 
    @Override 
    public ObservableValue<String> call(CellDataFeatures<List<String>, String>> data) { 
     return new ReadOnlyStringWrapper(data.getValue().get(0)) ; 
    } 
}); 
shortNameUnit = new TableColumn<List<String>, String>("Short Name"); 
shortNameUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, ObservableValue<String>>() { 
    @Override 
    public ObservableValue<String> call(CellDataFeatures<List<String>, String>> data) { 
     return new ReadOnlyStringWrapper(data.getValue().get(1)) ; 
    } 
}); 
nameUnit = new TableColumn<List<String>, String>("Name"); 
nameUnit.setCellValueFactory(new Callback<CellDataFeatures<List<String>, String>, ObservableValue<String>>() { 
    @Override 
    public ObservableValue<String> call(CellDataFeatures<List<String>, String>> data) { 
     return new ReadOnlyStringWrapper(data.getValue().get(2)) ; 
    } 
}); 

다음

public static ObservableList<List<String>> getUnits() { 

    final ObservableList<List<String>> data = FXCollections.observableArrayList(); 
    if (openConnection()) { 
     try { 
      rs = st.executeQuery("SELECT * FROM units"); 
      while (rs.next()) { 
       List<String> unit = new ArrayList<>(); 
       unit.add(rs.getString("id_unit")); 
       unit.add(rs.getString("short_name")); 
       unit.add(rs.getString("name")); 
       data.add(unit); 
      } 
     } catch (Exception ex) { 
      Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    closeConnection(); 
    return data; 
} 

을하지만 지금 당신의 코드는 대표하는 데이터의 의미의 거의 찾아 볼 수없는 것입니다 예를 들어, 당신은 단지 각 행을 보유 할 List<String>를 사용할 수 있습니다.

ResultSet을 여러 가지 이유로 직접 사용할 수 없습니다. 하나는 TableView의 데이터가 임의 액세스 목록으로 표시된다는 것입니다. ResultSet은 데이터 행 목록을 나타내는 것으로 생각할 수 있지만 List 인터페이스를 구현하지 않으며 임의 액세스 기능이 없습니다 (행 번호 5 등을 확보 할 수있는 보장 된 방법이 없음). 또 다른 이유는 ResultSet에 라이브 JDBC 자원이 필요합니다 (또는 적어도 JDBC 드라이버 구현에 따라 필요할 수 있음). 따라서 TableView가 범위 내에있는 동안 데이터베이스 테이블을 잠글 위험이 있습니다.

왜 데이터 표현 클래스를 생성하지 않으시겠습니까?

0

해결 방법이있는 TableView를 확장하여 사용자 정의 구성 요소를 만들 수 후 자신의 CustomTableView 클래스 내부의 마술을 할 수

관련 문제