JavaFX自定义控件(TextField)无法正常工作。

10

我正在尝试使用JavaFX和SceneBuilder 1.1创建自定义控件。

我有以下代码:

FXML


<?import libreria.javaFX.componentes.componenteTextField.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <CustomComponent fx:id="pastaTxt" layoutX="69.0" layoutY="87.0" prefWidth="200.0" />
  </children>
</AnchorPane>

CustomComponent.java


package libreria.javaFX.componentes.componenteTextField;

import javafx.scene.control.TextField;

public class CustomComponent extends TextField {

public CustomComponent() {
    super();
    // TODO Auto-generated constructor stub
}

public CustomComponent(String arg0) {
    super(arg0);
    // TODO Auto-generated constructor stub
}

当我尝试从SceneBuilder打开它时,它告诉我:

缺失的类型为:[CustomComponent]

并且它给我指定类路径的机会(但这也无法解决问题)。

我也尝试在导入语句中放置类,就像这样:

<?import libreria.javaFX.componentes.componenteTextField.CustomComponent?>

但是它会抛出一个 ClassNotFoundException 异常。

有任何想法为什么会发生这种情况吗?


更多信息

我做了一个新项目,只有这些类:

enter image description here

代码如下:

CustomControl.fxml

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

<?import custom.CustomControl?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?scenebuilder-classpath-element ../../bin/custom?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml">
  <children>
    <CustomControl layoutX="51.0" layoutY="100.0" prefWidth="200.0" />
  </children>
</AnchorPane>

CustomControl.java

package custom;

import javafx.scene.control.TextField;

public class CustomControl extends TextField {

    public CustomControl() {
        super();
    }

public CustomControl(String arg0) {
    super(arg0);

    }
}

我仍然有同样的问题。我用对话框指定了类路径,一切似乎都没问题,但是打开SceneBuilder时仍然出现相同的错误。


最新信息

为了接近解决方案,我们尝试在Eclipse下运行此项目。结果是Eclipse可以正常显示窗口,但是SceneBuilder仍然存在那些错误。希望这个线索能有所帮助。

如果有人在Scene Builder下完成过这种自定义控件定义,请告诉我们并给我们一个示例,这将对我们的项目非常有帮助。


使用场景构建器对话框添加路径肯定有效。当被询问时,您在哪里指定类路径?如果您正在使用Eclipse,则需要是bin目录。 - Andy Till
是的,我在编译项目后指定了bin目录。但是对我来说它不起作用... 我的代码如下:<?scenebuilder-classpath-element ../../../../../bin/libreria/javaFX/componentes/componenteTextField?> - xigoa
阅读Java类路径可能是个好主意。如果你有一个命名空间为libreria.MyComponent的类,那么你需要添加libreria的父目录而不是完整路径。尝试使用<?scenebuilder-classpath-element ../../../../../bin?>,虽然我总是使用对话框。 - Andy Till
我实际上已经使用了对话框。看起来一切都没问题,但是SceneBuilder在层次结构面板上不显示自定义组件,导入也无法正常工作,无论我如何指定它或类路径。我尝试了你建议的方法,但结果相同... - xigoa
我能想到的就是相对路径不正确。 - Andy Till
显示剩余5条评论
2个回答

4
这是由于没有指定正确的类路径导致的,这允许Java运行时加载控制类并运行Scene Builder。
如果您正在运行Eclipse且您的类具有命名空间custom.MyControl,则请指定bin目录而不是custom目录。在Maven项目中,您需要指定target/classes目录。
在我的项目中查看示例: https://bitbucket.org/atill/estimate/src/22390a2ca034b55f1916e46435b714e5c489b90e/src/main/resources/projmon/gui/workTree.fxml?at=master Scene Builder经常创建相对文件路径,因此移动文件将破坏类路径,您需要重新指定它。

1
Maybe it is late, but I would like to share what I did. I am using J8, Eclipse IDE, and Scenebuilder 2.0. 1) In Eclipse IDE, open the Navigator view from Window -> Show View -> Navigator. 2) Right-click on your project, select "Properties" on the class you want to see in SB (Scene Builder). Verify the location of the generated class from the Resource section. For example, you should see the location as follows: /TableViewDemo/bin/com/company/jfx8/example/fxmltableview/FormattedTableCellFactory.class 3) Copy this address and add "fxml", such as:
<?scenebuilder-classpath-element ../../../../TableViewDemo/bin/com/company/jfx8/example/fxmltableview/FormattedTableCellFactory.class?> 

4) 然后保存并享受你的工作:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接