을 트리거하면 더 많은 셀이 색이 잘못 표시됩니다. 셀이 비어 있어야하지만 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);
}
}
}
);
}
}
프로그램에 여러 래퍼가있는 여러 테이블이 있기 때문에 제네릭을 사용하고 있습니다. 여전히 많은 코드가 있지만 잘 작동합니다!
글쎄, 아직 내 솔루션과 함께 CSS를 사용하고 있습니까? 또한 셀 팩터 리 (툴팁 및 길이가 2보다 작은 값을 표시하지 않음)없이 구현할 수없는 셀 팩터 리에 추가 기능이 있으므로 셀 팩터 리가 필요합니다. 당신이 무엇을 원했을 지 확신하지 못합니다. –