Как заставить TextField заполнить всю оставшуюся ширину панели, содержащей несколько узлов? - PullRequest
2 голосов
/ 22 июня 2019

Мне нужно сделать приложение JavaFX, имитирующее чат, для моего задания (без веб-функций, только два текстовых поля для ввода и две текстовые области для вывода).Мне нужно иметь кнопку «Отправить» рядом с моим текстовым полем.Я не могу заставить текстовое поле заполнить ширину моего окна без «сжатия» кнопки при запуске, аналогично тому, как это делает свинг boxLayout?

Я ограничил ширину поля шириной родительской панели, вычтяШирина кнопки и размер панели, и она работает после того, как я начинаю изменять размер окна, но при первом запуске приложения текст кнопки отображается не полностью.

public void start(Stage stage_main) throws Exception {
        //Pane creation and nesting:
        HBox pane_main = new HBox();
        Scene scene_main = new Scene(pane_main, 480, 360);
        BorderPane pane_left_parent = new BorderPane();
        BorderPane pane_right_parent = new BorderPane();
        HBox pane_left_bottom = new HBox();
        HBox pane_right_bottom = new HBox();
        pane_main.getChildren().addAll(pane_left_parent, pane_right_parent); //Focusing only on the left pane for now for testing.
        pane_left_parent.setBottom(pane_left_bottom);

        //Contents creation and nesting:
        TextArea textA_left = new TextArea("Testing...");
        Button button_left = new Button("Send");
        TextField textF_left = new TextField("Test input...");
        textF_left.prefWidthProperty().bind(pane_left_bottom.widthProperty().subtract(button_left.widthProperty()).subtract(pane_left_bottom.spacingProperty()));

        //Placing contents in panes:
        pane_left_parent.setCenter(textA_left);
        pane_left_bottom.setSpacing(3);
        pane_left_bottom.getChildren().addAll(textF_left, button_left);

        //Finishing up:
        stage_main.setScene(scene_main);
        stage_main.show();
    }

Есть ли способ получить кнопку?у вас есть «лучший» размер уже при запуске без ручной настройки ширины в пикселях, как в размахе?

1 Ответ

1 голос
/ 22 июня 2019

Не связывайте prefWidth с родителем. Если вы хотите, чтобы дочерний элемент HBox рос горизонтально, вы можете установить для него ограничение hgrow:

HBox.setHgrow(theChild, Priority.ALWAYS);

Затем позвольте HBox обработать размер и расположение дочернего узла. И, как вы заметили, чтобы остановить уменьшение Button при изменении размера HBox, вам нужно установить minWidth. Тем не менее, вы должны использовать:

button.setMinWidth(Region.USE_PREF_SIZE);

Если вы используете getWidth(), вы можете случайно вызвать его до того, как Button будет иметь ненулевую ширину. Кроме того, использование USE_PREF_SIZE означает, что minWidth будет обновляться до prefWidth (если вы измените его по какой-либо причине).


Некоторые ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...