두 개의 사용자 정의 스킨이있는 JavaFX 컨트롤을 구현하고 있습니다. 나는 몇 가지 기본 컨트롤을 가지고 있으며, 각 컨트롤에는 두 개의 서로 다른 스킨과이 두 가지를 그룹화하는 컨트롤이 있습니다. 이제 합성 컨트롤의 스킨을 어떻게 구현할 수 있을지 궁금합니다. 두 가지 포함 된 컨트롤을 같은 방식으로 스킨 시키려고합니다. 즉, 합성 컨트롤에 대해 두 개의 스킨이 있어야하며 포함 컨트롤 중 하나를 적용해야합니다. 또한 껍질을 벗기십시오. 기본적으로 컨트롤 그래프에 피부를 재귀 적으로 적용하고 싶습니다. 모든 JavaFX 하위 컨트롤에 스킨 적용
class Control1 extends Control {}
class Control1Skin1 extends SkinBase<Control1> {}
class Control1Skin2 extends SkinBase<Control1> {}
class Control2 extends Control {}
class Control2Skin1 extends SkinBase<Control1> {}
class Control2Skin2 extends SkinBase<Control1> {}
class CompositeControl extend Control {
private final Control1 ctrl1 = new Control1();
private final Control2 ctrl2 = new Control2();
}
class CompositeControlSkin1 extends SkinBase<Control1> {}
class CompositeControlSkin2 extends SkinBase<Control1> {}
- 은 피부의 컨트롤 회원을합니다. 이것은 코드 중복을 초래하고 거기에 속하지 않는 스킨으로 로직을 이동시킵니다.
CompositeControl
에 접근자를 추가하여 포함 된 컨트롤에 액세스하십시오. 이렇게하면 캡슐화가 중단됩니다.- 멤버 패키지를 private로 설정하여 스킨이 액세스 할 수 있도록하고 스킨을 적절하게 설정합니다. 캡슐화의 경미한 위반이지만 피부와 컨트롤 클래스는 어쨌든 응집력있는 클러스터를 형성합니다.
- 하위 컨트롤에 대한 스킨을 반환하는 메서드가있는 사용자 지정
CompositeControlSkin
인터페이스를 정의합니다. 그런 다음 새로운 인터페이스에 CompositeControl.setSkin (스킨 스킨)to cast the
스킨 매개 변수를 오버라이드하고 스킨을 가져 와서 설정해야합니다. 3에서와 같이 멤버에 액세스해야하지만 추가적으로 다운 캐스트가 필요합니다. 나는 이것이 접근법을 실격시키는 것이라고 생각한다.
JavaFX에서 더 나은 방법이 있다면 궁금합니다. 합성 피부. 내가 찾은 사용자 정의 스킨 가능 컨트롤에 대한 설명서는 약간 희박하므로 링크 나 힌트에 감사드립니다.
'CompositeControl'은 특별히 'Control1'과 'Control2'를 캡슐화하기 위해 작성 되었기 때문에 불가피하게 밀접하게 결합됩니다. 게다가,'CompositeControlSkin #'는'CompositeControl'에만 적용 할 수 있으므로'CompositeControl'의 중첩 클래스이기도하므로'ctrl1'과'ctrl2'를 포함한 private 멤버에 액세스 할 수 있습니다. – Itai
우리는 그것에 동의 할 수 있다고 생각합니다. 복합 컨트롤의 스킨에 대한 JavaFX 프레임 워크에 대한 지원이 있는지 궁금합니다. – Jens