2016-09-29 4 views
1

을 트리거하면 더 많은 셀이 색이 잘못 표시됩니다. 셀이 비어 있어야하지만 css-pseudo-class ": filled"가 트리거됩니다. 관련된 cellValueFactory가 잘못되었거나 어딘가에 오류가 있는지 파악할 수 없습니다.JavaFX TableView에서 위와 아래로 스크롤 할 때 JavaFX TableView가 css ": filled"-Pseudo-class onScrolling

this is how it looks after scrolling a while

.fxml

error-cell:filled { 
    -fx-background-color: #ff3333; 
    -fx-text-fill: white; 
    -fx-opacity: 1; 
} 

형 .css

<BorderPane fx:id="projectList" stylesheets="@../css/projectList.css,@../css/tables.css" xmlns="http://javafx.com/javafx/8.0.45" xmlns:fx="http://javafx.com/fxml/1" fx:controller="my.package.ProjectListController"> 
    <center> 
     <TableView fx:id="projectListTableView"> 
      <columnResizePolicy> 
       <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> 
      </columnResizePolicy> 
      <columns> 

       <TableColumn fx:id="errorCol" styleClass="error-cell" text="Error"> 
        <cellValueFactory> 
         <PropertyValueFactory property="error" /> 
        </cellValueFactory> 
       </TableColumn> 

      </columns> 
     </TableView> 
    </center> 
</BorderPane> 

된 .java

public class ProjectListController 
{ 
    @FXML 
    private TableView<ProjectWrapper> projectListTableView; 

    @FXML 
    private TableColumn<ProjectWrapper, String> errorCol; 

    private ObservableList<ProjectWrapper> projectTable = FXCollections.observableArrayList(); 

    // dummy-method that fills projectTable, normally it's a db-query 
    public void fillErrorColumn() 
    { 
     ProjectWrapper pw = new ProjectWrapper(); 
     pw.setError("1/0/0"); 
     this.projectTable.add(pw); 
    } 


    public void populateTable() 
    { 
     try 
     { 
      projectListTableView.setItems(this.projectTable); 
     } 
     catch (Exception e) 
     { 
      logger.error("", e); 
     } 
    } 

} 

당신의 사람이 동작을 일으키는 이유를 생각할 수 있는가? 또는 스크롤하는 동안 셀이 비어 있도록하는 방법?


Btw, 너무 많은 유사한 지표가 있기 때문에 차라리 추가 cellValueFactory를 설정하지 않을 것입니다. 나는 또한 그것을 헛되이 시도했다 - 동일한 결과를 의미한다.

private void setCellFactoryErrorCol() 
{ 
    errorCol.setCellFactory(column -> 
    { 
     return new TableCell<ProjectWrapper, String>() 
     { 
      @Override 
      protected void updateItem(String item, boolean empty) 
      { 
       super.updateItem(item, empty); 

       if (item != null && item.length() > 2) 
       { 
        setText(item); // ohne setText() bleibt das Feld 
            // leer - wird nicht automatisch von 
            // super gesetzt 
        getStyleClass().add("error-cell"); 
        setTooltip(new Tooltip("All/In work/Fixed")); 
       } 
       else 
       { 
        setText(null); 
        setStyle(""); 
       } 
      } 
     }; 
    }); 
} 

대단히 감사합니다.


편집 한 나는 "James_D"의 '대답에서 코드를 사용하여 내 문제를 해결할 수 있습니다. 비록 CSS를 오히려 사용했을 것입니다. 2


편집이 LOC를 최소화하고 전반적인 유지 보수성을 향상시키기 위해, 나는 컨트롤러의 초기화 중에 부르는 utilityClass을 만들었습니다.

public class CellFactoryUtil 
{ 

    public <E> void setCellFactoryStringErrorCol(TableColumn<E, String> errorCol) 
    { 
     PseudoClass errorPC = PseudoClass.getPseudoClass("error-pc"); 

     errorCol.setCellFactory(column -> new TableCell<E, String>() 
      { 
       @Override 
       protected void updateItem(String item, boolean empty) 
       { 
        super.updateItem(item, empty); 

        if (item != null && item.length() > 2) 
        { 
         setText(item); 
         pseudoClassStateChanged(errorPC, true); 
         setTooltip(new Tooltip("All/In work/Fixed")); 
        } 
        else 
        { 
         setText(null); 
         pseudoClassStateChanged(errorPC, false); 
        } 
       } 
      } 
     ); 
    } 
} 

프로그램에 여러 래퍼가있는 여러 테이블이 있기 때문에 제네릭을 사용하고 있습니다. 여전히 많은 코드가 있지만 잘 작동합니다!

+0

글쎄, 아직 내 솔루션과 함께 CSS를 사용하고 있습니까? 또한 셀 팩터 리 (툴팁 및 길이가 2보다 작은 값을 표시하지 않음)없이 구현할 수없는 셀 팩터 리에 추가 기능이 있으므로 셀 팩터 리가 필요합니다. 당신이 무엇을 원했을 지 확신하지 못합니다. –

답변

0

CSS의 경우 스타일 클래스를 TableColumn에 적용하고 있습니다. 어떻게 작동하는지 명확하지 않습니다. TableColumn에 대한 JavaFX CSS guide에 대한 문서가 없습니다. 이를 수행하는 방법은 셀 팩터 리를 사용하는 것입니다.

가상 클래스는 :empty의 반대입니다. 즉, 테이블에 있지만 데이터가 실제로있는 행 아래에있는 빈 "채움 필러"셀을 제외한 모든 셀에 적용됩니다. :filled은 셀 데이터가 null (셀 데이터가 빈 문자열 인 경우) 인 경우에도 행에 데이터가있는 모든 셀에 대해 true이어야합니다.

셀 팩터 리 구현에서 결코 스타일 클래스 목록에서 "error-cell" 스타일 클 래스를 제거하지 마십시오. 또한 스크롤 할 때 문자열 "error-cell"의 여러 복사본을 스타일 클래스 목록에 추가 할 가능성이 있습니다 (잠재적으로 메모리 누수가 발생할 수 있음).

PseudoClass errorPC = PseudoClass.getPseudoClass("error"); 

errorCol.setCellFactory(column -> new TableCell<ProjectWrapper, String>() { 

    @Override 
    protected void updateItem(String item, boolean empty) 
    { 
     super.updateItem(item, empty); 

     if (item != null && item.length() > 2) 
     { 
      setText(item); // ohne setText() bleibt das Feld 
          // leer - wird nicht automatisch von 
          // super gesetzt 
      pseudoClassStateChanged(errorPC, true); 
      setTooltip(new Tooltip("All/In work/Fixed")); 
     } 
     else 
     { 
      setText(null); 
      pseudoClassStateChanged(errorPC, false); 
     } 
    } 

}); 

다음 CSS는

다음과 같습니다

당신은이에 대한 자신의 pseudoclass을 만드는 대신의 스타일 클래스를 조작하는 청소기 수도

errorCol.setCellFactory(column -> 
{ 
    return new TableCell<ProjectWrapper, String>() 
    { 
     @Override 
     protected void updateItem(String item, boolean empty) 
     { 
      super.updateItem(item, empty); 

      if (item != null && item.length() > 2) 
      { 
       setText(item); // ohne setText() bleibt das Feld 
           // leer - wird nicht automatisch von 
           // super gesetzt 
       if (! getStyleClass().contains("error-cell")) { 
        getStyleClass().add("error-cell"); 
       } 
       setTooltip(new Tooltip("All/In work/Fixed")); 
      } 
      else 
      { 
       setText(null); 
       setStyle(""); // not sure this line does anything: you never set the style anyway... 
       getStyleClass().remove("error-cell"); 
      } 
     } 
    }; 
}); 

주와 같은 뭔가가 필요

.table-cell:error { 
    -fx-background-color: #ff3333; 
    -fx-text-fill: white; 
    -fx-opacity: 1; 
} 
+0

답변 해 주셔서 감사합니다. 여러 가지면에서 도움이되었습니다. –

+0

약간 더 깔끔한 접근법을 보려면 업데이트를 참조하십시오. –

+0

업데이트가 잘 작동합니다! 빠르고 깊은 답변에 다시 한번 감사드립니다. –

관련 문제