如何在JavaFX自定义控件中创建fxml属性“text:”?

时间:2016-12-22 07:33:04

标签: javafx

我正在开发JavaFX自定义按钮。像这样。

    let sourceDateString = "12/20/2016 11:45 AM"
    let formatter = DateFormatter()
     formatter.dateFormat = "MM/dd/yyyy hh:mm a"
     formatter.timeZone = TimeZone(identifier: "UTC")
     let date = formatter.date(from: sourceDateString)

     print(date)

     formatter.timeZone = NSTimeZone.local
     formatter.dateFormat = "MMM dd,yyyy hh:mm a"

     let strDate = formatter.string(from: date!)
     print(strDate)

我想在FXML中使用此控件。但原始按钮和标签可以设置文本使用“测试:”像这样

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);
    }
}

<Button text="Search" textFill="white" prefWidth="130" GridPane.columnIndex="4" GridPane.rowIndex="1" styleClass="control" fx:id="search_btn" /> 无法使用此功能。我查了MyControl课。我知道Labeledtext

但我不知道这是什么,我该怎么用。我该怎么办??求你帮帮我。

2 个答案:

答案 0 :(得分:0)

您可以使用NamedArg注释:

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

否则fxml不知道你的意思是哪个构造函数。

现在可以按照你的要求在你的fxml中使用你的按钮:

<MyButton text="Search" ...

答案 1 :(得分:0)

实例FXML元素的属性或子属性元素的默认解释是它映射到实例中的JavaFX属性。 (基本上它依赖于使用JavaFX properties pattern的控件。)

换句话说,在您的FXML片段中:

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

或等同地

<MyButton>

FXMLLoader实例元素,它会导致MyButton创建text类的新实例,默认情况下调用默认构造函数。在任一版本中,FXMLLoader(第一个版本中的属性,第二个版本中的属性元素)将导致textProperty()查找WritableValue方法,返回StringProperty实例(例如setValue(...))。假设它找到一个,它会在WritableValue上调用"Search",传入字符串MyButton。 (有关所有这些术语的完整说明,请参阅FXML documentation。)

因此,您只需要textProperty()课程来定义适当的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(); } } 方法。由于您希望将其作为所包含按钮的文本,因此您可以委派该按钮的方法:

CL_SALV_COLUMN