java—将自定义组件扩展到全尺寸

xa9qqrwz  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(350)

我创建了一个用于可视化动态表的自定义组件。它有以下fxml。它被另一个fxml使用。提供的控制器不会对布局进行任何更改,因此我不在此处发布它们。
现在,当我启动应用程序时,它们应该调整到父级的大小。但他们没有:

组件本身会调整到正确的布局边界,而子级边界窗格则不会调整到正确的布局边界,如图所示:
结构:

动态组件:

dyntablecomponent的子级边框窗格:

fxml地址:

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import org.controlsfx.control.textfield.CustomTextField?>

<BorderPane xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.fc.gui.general.DynTableController">
    <center>
        <TableView BorderPane.alignment="CENTER" />
    </center>
    <top>
        <BorderPane BorderPane.alignment="CENTER">
            <right>
                <HBox>
                    <children>
                        <JFXButton onAction="#buttonCloseSearchClicked" styleClass="buttonSearchClose">
                            <graphic>
                                <FontAwesomeIconView styleClass="buttonSearchCloseIcon" />
                            </graphic>
                        </JFXButton>

                        <CustomTextField styleClass="searchField">
                            <left>
                                <Label styleClass="searchBoxLabel">
                                    <graphic>
                                        <FontAwesomeIconView styleClass="searchBoxLabelIcon" />
                                    </graphic>
                                </Label>
                            </left>
                        </CustomTextField>
                    </children>
               <BorderPane.margin>
                  <Insets right="10.0" top="10.0" />
               </BorderPane.margin>
                </HBox>

            </right>
        </BorderPane>
    </top>
    <bottom>
        <BorderPane maxHeight="40.0" prefHeight="40.0" prefWidth="600.0" BorderPane.alignment="CENTER">
            <right>
                <HBox alignment="CENTER_LEFT" maxHeight="40.0" prefHeight="40.0" prefWidth="200.0" BorderPane.alignment="CENTER">
                    <children>
                        <Label text="Label" />
                    </children>
                </HBox>
            </right>
        </BorderPane>
    </bottom>
</BorderPane>

动态组件:

public class DynTableComponent extends BorderPane
{
    private Node view;
    private DynTableController controller;

    public DynTableComponent()
    {
        super();
        FXMLLoader fxmlLoader = new FXMLLoader(
                getClass().getClassLoader().getResource("gui/fxml/general/DynTable.fxml"));
        fxmlLoader.setControllerFactory(new Callback<Class<?>, Object>()
        {
            @Override
            public Object call(Class<?> param)
            {
                return controller = new DynTableController();
            }
        });
        try
        {
            view = (Node) fxmlLoader.load();

        } catch (IOException ex)
        {
        }

        getChildren().add(view);
    }

    public void init(Class<? extends DatabaseItem> item)
    {
        controller.initializeTable(item);
    }
}

父项的fxml:

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

<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import org.controlsfx.control.textfield.CustomTextField?>
<?import de.fc.gui.general.DynTableComponent?>

<BorderPane xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.fc.gui.base.AddressViewController">
   <center>
      <DynTableComponent fx:id="dynTable"/>
   </center>
</BorderPane>

有人能解决这个问题吗?

ivqmmu1c

ivqmmu1c1#

解决方案1
我找到了解决办法。我没有使用自定义组件,而是将fxml包含在另一个fxml中,如下所示:

<BorderPane>
   <center>
      <fx:include source="../general/DynTable.fxml" />
   </center>
</BorderPane>

解决方案2:
现在我将组件定义为fx:root,如中所述https://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm#babdaahe 修改了控制器。现在起作用了。

相关问题