단일 JavaFX보기의 인스턴스 목록으로 ListView를 채우려합니다. 이것은 우리가 일찍 일하려고 시도한 것이고 시간이 없어진 것입니다. 당시 폴백 솔루션은 네 개의 행이있는 정적 패널 (ListView를 사용하지 않음)을 사용하는 것이 었습니다. 정적 버전에서 각 행은 동일한 JavaFX (FXML)보기의 인스턴스입니다.JavaFX ListView 셀의 하위보기를 표시하는 방법에 대한 조언
각 행은 작은 FXML 파일과 일치하는 컨트롤러의 개별 (인스턴스)입니다. 이것이 작동하는 방식은 initialize() 메서드가 호출 될 때 뷰가 id를 얻고 이것이 모델 데이터에 매핑 된 다음 컨트롤러/뷰에서 자체 데이터 행을 관리한다는 것입니다. 정적 인 경우에는 FXML include-directive를 사용할 수 있습니다. 이는 매우 간단합니다. 개별 행, 즉 행 뷰를 호출합니다.
- 목록보기 컨트롤러는 "목록 로더"
- 우리는 행보기를 원하는 목록을 초기화 /로드를 호출해야합니다 : 우리가 다음을 수행하기 위해 필요한이 방법으로 목록보기를 사용하려면 ListView에은 (서브)보기/(서브) 성분
- 행 시청을 할 경우 수행 OK 보인다 ListView에
- 개별 행으로 표시되는 것은 사전 패키지 인 서브 전망;
- 행 변경에 필요한 새 행 뷰 FXML 정의를 '로드'할 수 있어야합니다.
- 기존보기를 "복제하여 복사본을 만들 수있는 방법이 있습니까?
이 질문은 POJO 질문 유사하지만는 :
주요 차이점은 우리의 행이 임의 FXML 될 수 있다는 것이다. 이 기계 부품은 기존의 고정 크기 패널을 적용하여 작동한다고 생각합니다. 주요 개념은 디자인/요구 사항이 변경 될 때마다 목록 상자를 다시 코딩 할 필요없이 디스플레이 "스캐 폴드"를 설정하고보기를 스왑 아웃 할 수있게하는 것입니다.
업데이트하려면 ...
나는 약간의 진전을했습니다. "ViewLoader"라는 클래스로 FXML 파일을로드 할 수 있습니다. loadView (urlStr) 메소드가 있습니다. (puts, 그냥 로그 또는 sysout에 기록). 나는에는 loadView 그래서 알고 레이아웃으로 시작() 부하와 "urlStr"에 의해 명명 된 파일에 정의 된 AnchorPane를 반환하고있어
public AnchorPane loadView(final String urlStr){
AnchorPane fxmlView = null;
Parent root = null;
URL fxmlResource;
try
{
fxmlResource = getClass().getResource(urlStr);
root = FXMLLoader.load(fxmlResource, Resources.getResourceBundle());
this.fxmlStr = urlStr;
this.rootNode = root;
fxmlView = (AnchorPane) this.rootNode;
}
catch (Exception ex)
{
Util.puts(" * Exception on FXMLLoader.load()");
Util.puts(" * "+ex.getMessage());
Util.puts(" ----------------------------------------\n");
}
return fxmlView;
}
. 여태까지는 그런대로 잘됐다. 디버거에서로드 된 뷰를 관찰 할 수 있으며 컨트롤러를로드합니다. 각 셀에는 자체 컨트롤러가있어이 방식으로 독립적으로 작동합니다.
첫 번째 단계에서 순진한 접근 방식은 CellFactory를 통해 뷰를 설정하려고 시도하는 것이 었습니다. Bzzt! 이렇게하면보기가 무효화되므로 그렇게 할 수 없습니다.
분명히 사용자 정의 셀보기로 ListView를로드하는 방법이 필요합니다. 나는 그것이 어떻게 일어나게하는지에 관해서 난처하게 돈다. 현재 우리라는 지역 클래스를 사용하는 것이 :
public class CustomListView
{
:
public class CustomCellFactory implements Callback<ListView<MyObject>, ListCell<MyObject>>
{
@Override
public ListCell<MyObject> call(ListView<MyObject> listView) {
ListCell<MyObject> cell = new ListCellType();
return cell;
}
}//CustomCellCallback class
}//CustomListView
그것은 나에게 보인다하는 공장 패턴의 논리는 다음 새로운 ListCellType()는보기로로드 AnchorPane을 반환해야한다. 우리는로드 뷰를 반환하는 공장을 필요로하는 것처럼 어디 ListCellType는 그러나
public class ListCellType extends ListCell<MyObject>
{
:
}//ListCellType
... ListCell<>의 서브 클래스로 정의된다, 그렇게하는 대신
ListCell<MyObject> cell = new ListCellType();
이 응용 프로그램의 요구 나에게 보인다 JavaFX Node을 반환하거나이 특정 경우에 AnchorPane을 반환합니다 (나중에 더 일반적으로 만들 수 있습니다). 뭔가 는 다음과 같이-경우 : 이론 확인을 보인다
ListCell<AnchorPane> cell = new ListCellType();
있지만, 사실은 ListView.setCellFactory(...)가, ListView가 아닌 노드를 필요로 남아있다.
다른 공장/업데이트 구성표로이 작업을 수행하는 방법은 무엇입니까?
흠 ... 기술적으로 fxml을 알아낼 데이터 요소 목록과 해당 fxml에서 뷰를로드하는 cellFactory가 필요합니다. 결코 시도하지 않았다. – kleopatra
각 행에 대해 동일한 FXML을 재사용하고 싶습니다. 그렇다면 사용자 정의 cellFactory가 있습니다. 고마워, 고마워. – will
이 질문은 적합하다고 보입니다. http://stackoverflow.com/questions/19588029/customize-listview-in-javafx-with-fxml – will