2017-09-12 5 views
0

두 개의 사용자 정의 스킨이있는 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> {} 
  1. 은 피부의 컨트롤 회원을합니다. 이것은 코드 중복을 초래하고 거기에 속하지 않는 스킨으로 로직을 이동시킵니다.
  2. CompositeControl에 접근자를 추가하여 포함 된 컨트롤에 액세스하십시오. 이렇게하면 캡슐화가 중단됩니다.
  3. 멤버 패키지를 private로 설정하여 스킨이 액세스 할 수 있도록하고 스킨을 적절하게 설정합니다. 캡슐화의 경미한 위반이지만 피부와 컨트롤 클래스는 어쨌든 응집력있는 클러스터를 형성합니다.
  4. 하위 컨트롤에 대한 스킨을 반환하는 메서드가있는 사용자 지정 CompositeControlSkin 인터페이스를 정의합니다. 그런 다음 새로운 인터페이스에 CompositeControl.setSkin (스킨 스킨) to cast the 스킨 매개 변수를 오버라이드하고 스킨을 가져 와서 설정해야합니다. 3에서와 같이 멤버에 액세스해야하지만 추가적으로 다운 캐스트가 필요합니다. 나는 이것이 접근법을 실격시키는 것이라고 생각한다.

JavaFX에서 더 나은 방법이 있다면 궁금합니다. 합성 피부. 내가 찾은 사용자 정의 스킨 가능 컨트롤에 대한 설명서는 약간 희박하므로 링크 나 힌트에 감사드립니다.

+0

'CompositeControl'은 특별히 'Control1'과 'Control2'를 캡슐화하기 위해 작성 되었기 때문에 불가피하게 밀접하게 결합됩니다. 게다가,'CompositeControlSkin #'는'CompositeControl'에만 적용 할 수 있으므로'CompositeControl'의 중첩 클래스이기도하므로'ctrl1'과'ctrl2'를 포함한 private 멤버에 액세스 할 수 있습니다. – Itai

+0

우리는 그것에 동의 할 수 있다고 생각합니다. 복합 컨트롤의 스킨에 대한 JavaFX 프레임 워크에 대한 지원이 있는지 궁금합니다. – Jens

답변

1

먼저, 추가 스킨이 정말로 필요합니다. 스킨은 컨트롤이 기본값과 완전히 다르게 보이도록하려는 경우에만 필요합니다. 일반적으로 CSS로 응용 프로그램의 스타일을 지정하는 것으로 충분합니다.

private static final String DEFAULT_STYLE_CLASS = "my-control"; 

    [...] 

    public MyControl(){ 
     getStyleClass().setAll(DEFAULT_STYLE_CLASS); 
    } 
:

  1. 모든 스킨 사용자 지정 컨트롤이 특정 스타일 클래스

을 가져야한다 : 당신이 정말 추가 스킨 다음 단계를 확인해야 할 결론에 도달하는 경우

  1. 실제로 추가 스킨이 필요한 컨트롤을 식별합니다.

:

이 사용자 정의 CSS에 사용할

  • 재정의 스킨 (필요하지 않을 수도 있습니다 귀하의 복합 컨트롤의 예를 들어 추가 스킨) 당신의 모든 컨트롤에 대한 진실하지 않을 수 있습니다

    .my-control { 
        -fx-skin: "somepackage.skin.MyControlSkin2"; 
    } 
    

    고도의 맞춤 설정이 가능하고 재사용이 가능한 컨트롤을 원한다면 컨트롤을 확장하고 피부를 제공하면됩니다.

    대부분의 경우 응용 프로그램 개발자는 fx : root FXML 구문을 사용하여 재사용 가능한 컨트롤을 만들 수 있습니다. 예 : 귀하의 복합 컨트롤이 이에 대한 후보가 될 수 있습니다.

    사용자 정의 스킨 가능 컨트롤은 일반적으로 컨트롤을 특정 모양과 느낌에 연결하기 때문에 다른 컨트롤로 구성되지 않습니다. 스킨 가능 복합 컨트롤을 원한다면 중첩 컨트롤은 컨트롤이 아닌 스킨에 있어야합니다.