JavaFX - 使用FXML的另一个自定义控件中的自定义控件列表

时间:2018-04-10 02:59:55

标签: java javafx custom-controls fxml observablelist

我想创建一个自定义控件,我可以设置另一个自定义控件的列表,我希望能够像在JavaFX TableView中那样使用FXML(参见列列表):

JavaFX TableView

TableView.fxml

<TableView fx:id="tableView">

    <columns>

      <TableColumn>
          ...
      </TableColumn>

      <TableColumn>
          ...
      </TableColumn>

      ...

    </columns>
</TableView>

TableView.java

public class FXMLTableViewController {

    @FXML TableView<MyBean> tableView;

    private void myMethod1() {
        ObservableList<TableColumn<MyBean, ?>> columns = tableView.getColumns();
        ...

    }
}

我只想写点:

CustomControl1

CustomControl1.fxml

<?import javafx.scene.control.*?>

<fx:root type="javafx.scene.control.Control" xmlns:fx="http://javafx.com/fxml"> 
   <customList>

       <CustomControl2>
           ...
       </CustomControl2>

       <CustomControl2>
           ...
       </CustomControl2>

       ...

   </customList>
</fx:root>

CustomControl1.java

public class CustomControl1 extends Control {

    private ObservableList<CustomControl2> controls2;

    public CustomControl1() {
        FXMLLoader fxmlLoader = new 
        FXMLLoader(getClass().getResource("CustomControl1.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();            
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }

    private void myMethod1() {
        controls2 = getControls2();
        ...
    }
}

我已经知道如何实现简单的自定义控件,但我还没有找到任何关于以这种方式编写自定义控件的信息。你能指点一些方向吗?

1 个答案:

答案 0 :(得分:0)

您应该在<fx:root>元素中使用该类的实际类型,因为Control不提供customList。即使用像type="my.package.CustomControl1"这样的东西。

此外,以TableView允许您为周围标记创建的类的方式添加元素需要提供带有标记名称的只读列表属性,即

public class CustomControl1 extends Control {

    ...

    public ObservableList<CustomControl2> getCustomList() {
        return controls2;
    }

}