Растяжение нестандартного компонента до полного размера - PullRequest
0 голосов
/ 06 декабря 2018

Я создал пользовательский компонент для визуализации динамической таблицы.Он имеет следующий FXML.Это используется другим FXML.Предоставленные контроллеры не вносят никаких изменений в макет, поэтому я не публикую их здесь.

Теперь, когда я запускаю Приложение, они должны изменить размер до размера Parent.Но они этого не делают:

enter image description here

Компонент сам изменяет размеры до правильных границ макета, в то время как дочерние элементы BorderPane не видны, как это можно увидетьздесь:

Структура:

enter image description here

DynTableComponent:

enter image description here

Дети DynTableComponent BorderPane:

enter image description here

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>

DynTableComponent:

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>

У кого-нибудь есть решение этой проблемы?

1 Ответ

0 голосов
/ 06 декабря 2018

Решение 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 и модифицировал контроллер.Теперь это работает.

...