2017-12-13 9 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

次のコードは、任意のJavaFXの原則に違反しないか、それが安全に使用する のですか? javaの

あなたがOverridable method in constructor を呼び出して、あなたのIDEとしてのNetBeansを使用している場合、それはメッセージ"Overridable method call in constructor"と警告を表示し、ここでの問題のた記述があるので、このコードを使用するのは安全ではありません。

オーバーライドされたメソッドが呼び出された時点でオブジェクトが完全に初期化されていないため、コンストラクタ ではオーバーライド可能な呼び出しメソッドが危険です。

第二に、あなたは地域、グループ、コンテナに子ノードを追加することができますが、コントロールに子ノードを追加することをお勧めではない、とあなたがControlFxの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ではCustomTextFieldを拡張:これを行うには

//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); 
     } 
    } 
関連する問題