2016-12-22 4 views
0

У меня есть настраиваемая пользовательская кнопка JavaFX. Как это.Как создать свойство fxml "text:" в пользовательском элементе управления JavaFX?

public class MyButton extends Control{ 
    private static final String DEFAULT_STYLE_CLASS = "satrec-button"; 
    private Button button; 

    public MyButton(){ 
     getStyleClass().setAll(DEFAULT_STYLE_CLASS); 
    } 

    @Override 
    public String getUserAgentStylesheet(){ 
     return "sample/css/button.css"; 
    } 

    public void setButton(Button button){ 
     this.button = button; 
    } 
    public void setText(String text){ 
     this.button.setText(text); 
    } 
} 

Я хочу использовать этот элемент управления в FXML. Но оригинальная кнопка и метка может установить текст, чтобы использовать «тест:» Как это

<Button text="Search" textFill="white" prefWidth="130" GridPane.columnIndex="4" GridPane.rowIndex="1" styleClass="control" fx:id="search_btn" /> 

Но MyControl не может использовать эту функцию. Я посмотрел Labeled класс. Я знаю, text является StringProperty.

Но я не знаю, что это такое и как я могу использовать. Как мне это сделать?? Пожалуйста, помогите мне.

+0

Вы должны иметь StringProperty под названием «Текст» в пользовательском элементе управления, так что вы можете использовать его в FXML , Или вы можете расширить MyButton из класса Button. – ItachiUchiha

+0

Кроме того, если вы попытаетесь использовать это в FXML любым из очевидных способов, не будет 'button' равно null, когда загрузчик FXML пытается установить текст? Вероятно, вы должны убедиться, что в конструкторе инициализируется 'button'. –

ответ

0

По умолчанию интерпретация элемента атрибута или дочернего элемента элемента FXML экземпляра заключается в том, что он сопоставляется с свойством JavaFX в экземпляре. (По существу, он опирается на контроль с использованием JavaFX properties pattern.)

Другими словами, в вашем FXML сниппета:

<MyButton text="Search" ... /> 

или, что то же самое,

<MyButton> 
    <text> 
     <String fx:value="Search" /> 
    </text> 
</MyButton> 

<MyButton> является элемент экземпляра, и он вызывает создание FXMLLoader для создания новых tance класса MyButton, вызывающий по умолчанию конструктор по умолчанию. В любой версии, text (атрибут в первой версии, элемент свойства во втором) приведет к тому, что FXMLLoader будет искать метод textProperty(), возвращая экземпляр WritableValue (например, StringProperty). Предполагая, что он найдет один, он назовет setValue(...) по этому адресу WritableValue, проходя в строке "Search". (Полное описание всей этой терминологии приведено в FXML documentation).

Для определения подходящего метода textProperty() вам нужен только класс MyButton. Так как вы хотите, чтобы это текст включены кнопок, вы можете просто передать методу этого баттона:

public class MyButton extends Control{ 
    private static final String DEFAULT_STYLE_CLASS = "satrec-button"; 
    private Button button; 

    public MyButton(){ 
     getStyleClass().setAll(DEFAULT_STYLE_CLASS); 
    } 

    @Override 
    public String getUserAgentStylesheet(){ 
     return "sample/css/button.css"; 
    } 

    public void setButton(Button button){ 
     this.button = button; 
    } 

    public StringProperty textProperty() { 
     if (button == null) { // might be better to write the class so that this is never true? 
      button = new Button(); 
     } 
     return button.textProperty(); 
    } 

    public final void setText(String text) { 
     textProperty().set(text); 
    } 

    public final String getText() { 
     return textProperty().get(); 
    } 
} 
+0

Спасибо за ваш ответ! Я решил это! – rlawlstjd007

0

Вы можете использовать NamedArg Аннотация:

public MyButton(@NamedArg("text") String text) { 
    this(); 
    this.setText(text); 
} 

иначе FXML не знает, какой конструктор аргумент вы имеете в виду.

Теперь можно использовать кнопки в вашем FXML, как вы просили:

<MyButton text="Search" ....

+0

было бы здорово объяснить нижний план, этот подход всегда работал для меня. – user7291698

+0

Это будет работать, но это не стандартный подход, и вы, конечно, не «должны» это делать. Ваш ответ должен объяснить стандартный способ сделать это, а затем, если хотите, объясните, что делает '@ NamedArg', что этот метод не делает. –

+0

Кроме того, я думаю, что если вы не внесете какие-либо изменения в 'MyButton', этот конструктор всегда будет генерировать исключение нулевого указателя, нет? –

Смежные вопросы