JavaFX8의 TableView에서 JDK-88144681 오류 방지
제가 취한 회피 대책과 원본 코드를 소개하겠습니다.
1. 질문 JDK-88144681은? javafx.scene.control.TableView<S>
에서 열을 재배열할 때 발생하는 문제.
전제 조건
재현 순서
ArrayIndexOutOfBoundsException
발생2. 회피 전략
JavaFX8 라이브러리의 소스 코드 때문에 근본 원인을 수정하기가 어렵습니다.
따라서 예외가 발생하지 않도록 기피 대책이 필요하다.
채용하지 않는 이유
사용할 수 없음
말하자면 다시 배열하지 않으면 일어나지 않을 거야!
그러나 JavaFX8의 TableView 기본 동작인 정렬 기능을 사용할 수 없게 되면 가용성이 떨어집니다.그래서 이번에 나는 이 방안을 포기했다.
이벤트 발생 시 상태 선택 취소
조사 결과 열을 다시 배열할 때'다시 배열'을 나타내는 활동이 발생하지 않았다는 것을 알게 됐다.
그래서 바늘로 잡고 다시 배열하지 못한 동작

3. 소스 코드
드래그 사건은 대원 TableView에서 발생했습니다.
다른 드래그 이벤트와 구별하기 위해서, 이벤트 원본이 헤더에 속하는지 확인하고 작업을 실행합니다.
FxApplication.java// [JDK-8144681] 不具合回避のため reordering直前にselect/focusを解除する
tableView.addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> {
boolean isHeaderNode = false;
// 親ノードを探索し TableColumnHeaderに属しているかを調べる
for (Node node = (Node) event.getTarget() ; ; node = node.getParent()) {
if(node == null || node instanceof TableView) {
break;
}
if(node instanceof TableColumnHeader){
isHeaderNode = true;
break;
}
}
if(! isHeaderNode) return;
tableView.getSelectionModel().clearSelection();
tableView.getFocusModel().focus(-1);
});
총결산
상당히 제한된 조건에서 발생한 문제지만 JDK8에서 타블뷰를 사용하면 반드시 발생할 것이기 때문에 대책상 손해는 없을 것이라고 생각한다.
Reference
이 문제에 관하여(JavaFX8의 TableView에서 JDK-88144681 오류 방지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hondaYoshitaka/items/1e6f87fa0cb0be9eaf32
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// [JDK-8144681] 不具合回避のため reordering直前にselect/focusを解除する
tableView.addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> {
boolean isHeaderNode = false;
// 親ノードを探索し TableColumnHeaderに属しているかを調べる
for (Node node = (Node) event.getTarget() ; ; node = node.getParent()) {
if(node == null || node instanceof TableView) {
break;
}
if(node instanceof TableColumnHeader){
isHeaderNode = true;
break;
}
}
if(! isHeaderNode) return;
tableView.getSelectionModel().clearSelection();
tableView.getFocusModel().focus(-1);
});
상당히 제한된 조건에서 발생한 문제지만 JDK8에서 타블뷰를 사용하면 반드시 발생할 것이기 때문에 대책상 손해는 없을 것이라고 생각한다.
Reference
이 문제에 관하여(JavaFX8의 TableView에서 JDK-88144681 오류 방지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hondaYoshitaka/items/1e6f87fa0cb0be9eaf32텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)