2017-12-13 14 views
2

JavaFX-TextField 위에 텍스트를 표시하고 싶습니다. prompText을 설정하는 것은 내가 원했던 것이지만, 나의 유스 케이스에는 몇 가지 단점이있다. 다음 코드는 작동하는 것 같지만 TextField의 자식에게 Label을 추가하는 것은 잘못되었습니다. 다음 코드가 JavaFX 원칙을 위반하거나 사용하기에 안전합니까?JavaFX : TextField에 하위 레이블 추가

public class MyTextField extends TextField {  
    public MyTextField() { 
     Label label = new Label("test"); 
     this.getChildren().add(label); 
    } 
} 
+0

아마 사용자 정의 스킨을 정의하여 것이이 작업을 수행하는 "올바른"방법,하지만이 될 것입니다 많은 일. .. promptText의 단점은 무엇입니까? 그것은 가능한 더 나은 해결 방법이있을 수 있습니다 ... –

+0

@James_D :'MyTextField'는 표준 구현에 몇 가지 기능을 추가하지만이 함수가 제대로 작동하려면'init()'메서드를 먼저 호출해야합니다. 'init()'은 생성자로부터 호출 될 수 없다. 'Label'은 개발자에게'init()'을 적절하게 호출하지 않았다는 힌트를 제공해야합니다. 개발자가 뭔가 잘못하고 있음을 상기시킬 수있는 다른 방법이 많이 있다는 것을 알고 있습니다.하지만이 경고 방법은 가장 짧은 것으로 보입니다. 이 코드가 실제로 잘못되었다는 의견을 해석 할 수 있습니까? – user7291698

+1

컨트롤의 자식 노드가 어떻게 배치 될지 전혀 알지 못하기 때문에 노드를 컨트롤의 자식으로 추가하는 것은 좋지 않습니다. 이는 UI에서 정의되지 않았으며 컨트롤은 그런 식으로 사용되지 않기를 바랍니다. 그러나 UI를 수정하여 개발자가 올바르게 클래스를 사용하지 않았다는 신호를받는 것은 훨씬 더 실용적입니다. 이 경우에는 UI를 수정하지 말고 어설 션 오류를 발생시켜야합니다. (단 한 가지 예 : 앞으로 몇 가지 자동화 된 테스트를 사용하면 어떻게됩니까? 라벨을 어떻게 감지 할 수 있습니까?) –

답변

1

다음 코드는 자바 FX 원칙을 위반 않거나 안전 사용 입니까? 자바이 코드에서

당신이 Overridable method in constructor 를 호출하고 당신이 당신의 IDE로 넷빈즈를 사용하는 경우,이 메시지 "Overridable method call in constructor" 여기에 문제의 descritpion 당신을 경고하기 때문에 사용하는 것이 안전하지 않습니다이다 :

오버라이드 된 메서드가 호출 될 때 개체가 완전히 초기화되지 않았기 때문에 생성자에서 오버 라이딩 될 수있는 호출 메서드가 위험 할 수 있습니다.

둘째, 당신은 지역, 그룹, 컨테이너에 자식 노드를 추가 할 수 있지만 컨트롤에 자식 노드를 추가하는 것은 좋은 방법이 아닙니다, 당신은 당신이 ControlFx의 CustomTextField를 사용할 수있는 텍스트 필드에 레이블을 추가해야하는 경우,이 CustomTextField

 Label myLabel=new Label("Hello"); 
    /*You use a container if you need add many nodes in CustomTextField*/ 
    //HBox box=new HBox(); 
    //box.getChildren().add(myLabel); 
    CustomTextField customField=new CustomTextField(); 
    customField.setRight(mylabel); 
    //customField.setLeft(mylabel); 
    //customField.setRight(box); 

을 OR로 확장 : 코드의 예는 아마 당신의 필요에 도움이됩니다

//This code is safe and the warning is removing here 
public class MyTextField extends CustomTextField { 

     public MyTextField() { 
      Label label = new Label("test"); 
      this.setRight(label); 
     } 
    }