如何在javafx-8中绑定FXML文件中我自己的组件的自定义属性?

时间:2014-03-19 13:37:47

标签: javafx javafx-8

此代码在javafx-2.2中正常工作,但在javafx-8中无法正常工作(来自oracle下载的1.8.0-b132) 属性绑定f2.myText不起作用。怎么了?

test.fxml内容:     

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx8test.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0"  xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
    <TextField fx:id="f1" layoutX="70" text="${f2.myText}" layoutY="20" />
    <MyTextField fx:id="f2" layoutX="70" layoutY="60" />
</children>
</AnchorPane>

MyTextField.java内容:

package javafx8test;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TextField;

public class MyTextField extends TextField{
    private StringProperty myText = new SimpleStringProperty();

    public MyTextField(){
        super();
        textProperty().addListener(new ChangeListener<String>(){
            @Override
            public void changed(ObservableValue<? extends String> ov, String t, String t1) {
                myText.set( "("+t1+")");
            }
        });
    }

    public StringProperty myTextProperty(){
        return myText;
    }

    public void setMyText(String str){
        myText.set(str);
    }

    public String getMyText(){ 
        return myText.get(); 
    }

}

Javafx8Probs.java内容:

package javafx8test;
import java.net.URL;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class Javafx8Probs extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {

        URL url =Javafx8Probs.class.getResource("test.fxml");
        FXMLLoader fxmlLoader = new FXMLLoader(url);
        Parent root = (Parent) fxmlLoader.load();

        Stage s = new Stage();

        Scene scene=new Scene(root);
        s.setScene(scene);

        s.show();

        TextField f1 = (TextField)scene.lookup("#f1");
        MyTextField f2 = (MyTextField)scene.lookup("#f2");

        f2.setMyText("asdasd");
    }

}

1 个答案:

答案 0 :(得分:2)

这看起来像一个错误:你应该在https://javafx-jira.kenai.com

提交

修复方法是将属性初始化为类的完全属性,为getBean()和getName()提供正确的值。无论如何,这是一种很好的做法,但对于你的绑定工作来说可能不是必需的。

private StringProperty myText = new SimpleStringProperty(this, "myText");