Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在fxml中使用自定义控件_Java_Javafx_Custom Controls - Fatal编程技术网

Java 在fxml中使用自定义控件

Java 在fxml中使用自定义控件,java,javafx,custom-controls,Java,Javafx,Custom Controls,假设我对javafx提供的默认TableView类进行了子类化,并创建了一个类PersonTableView扩展了TableView。该子类存在于java代码中,根本不使用fxml。它定义并封装了我的Person对象所需的行为 现在我想在fxml文件中使用自定义类的实例,就像使用所有默认控件一样。这正是我的问题所在,我不知道如何做到这一点,或者这是否是一个好的/常见的设计决策 我想将我的特定TableView的行为封装在它自己的类中,但是布局应该在fxml中定义,因为它与逻辑无关,它只是一种装饰

假设我对javafx提供的默认
TableView
类进行了子类化,并创建了一个类
PersonTableView扩展了TableView
。该子类存在于java代码中,根本不使用fxml。它定义并封装了我的
Person
对象所需的行为

现在我想在fxml文件中使用自定义类的实例,就像使用所有默认控件一样。这正是我的问题所在,我不知道如何做到这一点,或者这是否是一个好的/常见的设计决策

我想将我的特定TableView的行为封装在它自己的类中,但是布局应该在fxml中定义,因为它与逻辑无关,它只是一种装饰

我设想在.NET的WPF中可以找到一种类似的语法和功能,您可以像任何其他控件一样在标记中使用自定义类,因为xaml和c#的耦合比java和fxml更紧密

从我目前的观点来看,我所描述的是不可能做到的,相反,我将只使用非常少量的fxml和更多的代码,即使对于只是布局的部分也是如此。例如,我不想使用这样的代码:

 AnchorPane.setRightAnchor(customControl, 65.0);
因为我相信在我的fxml中定义它是一个好主意


因此,我的问题是,我如何实现上述内容;或者,如果这种情况不常见,那么获得类似于我刚才描述的功能的常见“最佳实践”方法是什么?

这就是您想要的吗?这对我来说很好

package numerictextfield;

import java.util.regex.Pattern;

import javafx.scene.control.IndexRange;
import javafx.scene.control.TextField;

public class NumericTextField extends TextField {

    private final Pattern intPattern = Pattern.compile("[0-9]*");

    public NumericTextField(String text) {
        super(text);
    }
    public NumericTextField() {
        super();
        this.insertText(0, "");
        this.replaceSelection("");
        this.replaceText(new IndexRange(0, 0), "");
        this.replaceText(0, 0, "");
    }

    @Override
    public void insertText(int index, String text) {
        if (intPattern.matcher(text).matches()) {
            super.insertText(0, text);
        }
    }

    @Override
    public void replaceSelection(String text) {
        if (intPattern.matcher(text).matches()) {
            super.replaceSelection(text);
        }
    }

    @Override
    public void replaceText(IndexRange range, String text) {
        if (intPattern.matcher(text).matches()) {
            super.replaceText(range, text);
        }
    }

    @Override
    public void replaceText(int start, int end, String text) {
        if (intPattern.matcher(text).matches()) {
            super.replaceText(start, end, text);
        }
    }

}
然后

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.AnchorPane?>
<?import numerictextfield.NumericTextField?>

<AnchorPane xmlns:fx="http://javafx.com/fxml" >
    <NumericTextField text="12345" >
        <AnchorPane.rightAnchor>65.0</AnchorPane.rightAnchor>
    </NumericTextField>
</AnchorPane>

65

它应该可以正常工作。只需在fxml文件的顶部包含一个
,您就可以执行