2017-01-02 1 views
0

동적 테이블과 뷰가있는 테이블 뷰를 만들고 싶습니다. 데이터 소스에서 값을 얻자 마자 백그라운드에서 각 셀 값을 업데이트하고 싶습니다. 이것은 내가 스윙에서 사용한 setValueAt()입니다. 그래서 기본적으로 모델 열을 만들지 않으려 고합니다. 열이 고정되어 있지 않고 행이 고정되어 있지 않기 때문에 테이블보기에서 행을 하나씩 업데이트하기 위해 테이블 ​​뷰를 다시 만들고 싶지 않기 때문에 가이드가 필요합니다. 새로운 javafx 뷰. the javadoc이 말한대로 당신이 다음 내 질문을 이해하지 않으면 경우,JAVAFX의 테이블 뷰에서 각 행의 값을 업데이트하는 방법

편집 예제 소스 코드 테이블 모델 항목입니다 보유 재산을

import javafx.application.Application; 
import javafx.beans.property.ReadOnlyObjectWrapper; 
import javafx.collections.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

import java.util.*; 

public class DynamicTableView extends Application { 

private static final int N_COLS = 5; 
private static final int N_ROWS = 1000; 

public void start(Stage stage) throws Exception { 
    TestDataGenerator dataGenerator = new TestDataGenerator(); 

    TableView<ObservableList<String>> tableView = new TableView<>(); 

    // add columns 
    List<String> columnNames = dataGenerator.getNext(N_COLS); 
    for (int i = 0; i < columnNames.size(); i++) { 
     final int finalIdx = i; 
     TableColumn<ObservableList<String>, String> column = new TableColumn<>(
       columnNames.get(i) 
     ); 
     column.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))); 
     tableView.getColumns().add(column); 
    } 

    // add data 
    for (int i = 0; i < N_ROWS; i++) { 
     tableView.getItems().add(
       FXCollections.observableArrayList(
         dataGenerator.getNext(N_COLS) 
       ) 
     ); 
    } 

    tableView.setPrefHeight(200); 

    Scene scene = new Scene(tableView); 
    stage.setScene(scene); 
    stage.show(); 
} 

public static void main(String[] args) { 
    launch(args); 
} 

private static class TestDataGenerator { 

    private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" "); 

    private int curWord = 0; 

    List<String> getNext(int nWords) { 
     List<String> words = new ArrayList<>(); 

     for (int i = 0; i < nWords; i++) { 
      if (curWord == Integer.MAX_VALUE) { 
       curWord = 0; 
      } 

      words.add(LOREM[curWord % LOREM.length]); 
      curWord++; 
     } 

     return words; 
    } 
} 
} 

답변

1

감사 의견을주십시오. 다음과 같이 할 수 있습니다 :

table.getItems() 

(추가, 제거, 삭제 ...).

본인의 예에서 볼 수 있듯이 String of Table이 있습니다. 각 열에 표시되는 내용을 선택하려면 setValueFactory()을 사용해야합니다. 이 방법으로 각 열은 각 값을 렌더링하는 방법을 알 수 있습니다.

"Hi how are you?" 

그리고 당신이 추천 열을받을 수 있나요하려고 :

hi | how | are | you? 

당신은 단지 itetate 각 열 이상과 param.getValue을 분할하는 cellValueFactory을 설정할 수의 당신이 문자열 있다고 가정 해 봅시다()와 대응하는 색인을 취한다.

편집 : 추가하여 changeValueAt() :

private static void changeValueAt(int row, int col, String value, TableView<ObservableList<String>> table){ 
    ObservableList newData = table.getItems().get(row); 
    newData.set(col, value); 
    table.getItems().set(row, newData); 

가}

렌더러는 매번 해고 :

public class DynamicTableView extends Application { 

private static final int N_COLS = 5; 
private static final int N_ROWS = 1000; 

public void start(Stage stage) throws Exception { 
    TestDataGenerator dataGenerator = new TestDataGenerator(); 

    TableView<ObservableList<String>> tableView = new TableView<>(); 

    // add columns 
    List<String> columnNames = dataGenerator.getNext(N_COLS); 
    for (int i = 0; i < N_COLS; i++) { 
     final int index = i; 
     TableColumn<ObservableList<String>, String> column = new TableColumn<>(columnNames.get(i)); 
     column.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<>((cellData.getValue().get(index)))); 
     tableView.getColumns().add(column); 
    } 

    // add data 
    for (int i = 0; i < N_ROWS; i++) { 
     tableView.getItems().add(FXCollections.observableArrayList(dataGenerator.getNext(N_COLS))); 
    } 

    tableView.setPrefHeight(200); 

    Scene scene = new Scene(tableView); 
    stage.setScene(scene); 
    stage.show(); 
    changeValueAt(0,0, "thisIsMyNewValue", tableView); 

} 

private static void changeValueAt(int row, int col, String value, TableView<ObservableList<String>> table){ 
    ObservableList newData = table.getItems().get(row); 
    newData.set(col, value); 
    table.getItems().set(row, newData); 

} 

public static void main(String[] args) { 
    launch(args); 

} 

private static class TestDataGenerator { 

    private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem." 
      .split(" "); 

    private int curWord = 0; 

    List<String> getNext(int nWords) { 
     List<String> words = new ArrayList<>(); 

     for (int i = 0; i < nWords; i++) { 
      if (curWord == Integer.MAX_VALUE) { 
       curWord = 0; 
      } 

      words.add(LOREM[curWord % LOREM.length]); 
      curWord++; 
     } 

     return words; 
    } 
} 

은}

중요한 것은 이것이다 속성이 변경됩니다. 변경하려는 행의 요소에 액세스하면 열의 요소에 액세스 할 수 있습니다. 이를 변경하면 변경 사항이 새 값을 렌더링하는 열에 표시됩니다.

EXPLANATION

의 TableView의 일반 클래스는 (항목의 속성)에 보관 유지되고있는 TableView ObservableList의 일반적인 유형의 클래스를 나타낸다. 이 유형은 그렇게함으로써, 행의 유형과 일치 : 당신이 당신의 경우 ObservableList에, 첫 번째 행의 데이터를 보유하고있는 객체를 검색하는

table.getItems().get(0) 

. 이것이 table.getItems()가

ObservableList<ObservableList<String>> 

(제공된 일반 유형의 ObservableList)을 반환하는 이유입니다.

각 열을 렌더링하는 동안 TableView 제네릭 형식과 열 데이터 형식을 표시 한 다음 보유한 정보에서 셀 값을 가져 오는 방법을 구현하는 CellValueFactory를 제공해야합니다.

이 모든 기능은 일반 데이터 유형과 비슷하지만 변경 사항이 적용되는 속성을 사용합니다. 그래서 내 메서드가 작동하는 이유는 일단 속성을 수정하면이 속성은 변경된 이벤트를 발생시키고 테이블은 다시 나타나게됩니다 (간단한 설명). 여기서 변경 사항은 열을 보유하는 목록, 열을 보유하는 목록이 통지받지 못하는 열을 변경하여이 변경 사항이 전파되지 않는다는 것입니다. 그것이 이미 수정 된 후에 동일한 행을 다시 설정하는 이유입니다.

예를 들어, 보통 테이블에 일반 POJO가 있고 상호 작용하는 ObservableList 만 items 속성이므로 매우 드문 예입니다.

+0

해답을 주셔서 감사합니다. 그러나 이것은 솔루션을 검색하는 동안 제가 잡은 예제입니다. 사용 사례가 완전히 무의미합니다. –

+0

스윙의 setValueAt() 메소드와 같은 것이 필요합니다. –

+0

Sorrry, 원하는 것을 얻은 것 같아요. 말할 수는 있지만 어떻게 구현해야하는지 이해할 수 없다면 가능하다면 위의 코드를 편집하여 보여 줄 수 있습니까? –

관련 문제