BorderPane/StackPane не изменяет размер после изменения дочерних элементовJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 BorderPane/StackPane не изменяет размер после изменения дочерних элементов

Сообщение Anonymous »

У меня возникла проблема с изменением размера при добавлении и удалении содержимого из JavaFX BorderPane. Размер содержимого BorderPane не изменяется до тех пор, пока размер окна не будет изменен вручную. Я написал небольшое тестовое приложение для моделирования такого поведения. Приложение создает BorderPane, содержащий прямоугольник, встроенный в StackPane в центре BorderPane. В нижней части BorderPane находятся VBox и HBox, содержащие текст и разделитель. Существует пункт меню, который удаляет содержимое из нижней части BorderPane (MoveText -> Right) и добавляет аналогичное содержимое в правую позицию BorderPane.
Когда текст добавляется в правильное положение BorderPane, прямоугольник перекрывает текст. Другими словами, содержимое центра BorderPane перекрывает содержимое правой части BorderPane.
Я увидел следующую ссылку: https://stackoverflow.com/questions/5302197/javafx- ошибка-есть-способ-принудительно-перерисовать-это-не-однопоточность-pr
Вызов requestLayout, похоже, не помогает. Я также пробовал вызывать impl_updatePG и impl_transformsChanged на различных узлах графа. Я получил эту идею из этой темы - https://forums.oracle.com/forums/thread ... ID=2242083
public class BorderPaneExample extends Application
{
private BorderPane root;
private StackPane centerPane;

@Override
public void start(Stage primaryStage) throws Exception
{
root = new BorderPane();
root.setTop(getMenu());
root.setBottom(getBottomVBox());
centerPane = getCenterPane();
root.setCenter(centerPane);

Scene scene = new Scene(root, 900, 500);
primaryStage.setTitle("BorderPane Example");
primaryStage.setScene(scene);
primaryStage.show();
}

private MenuBar getMenu()
{
MenuBar menuBar = new MenuBar();

MenuItem rightMenuItem = new MenuItem("Right");
rightMenuItem.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent actionEvent) {
root.setRight(getRightHBox());
root.setBottom(null);
root.requestLayout();
}
});
MenuItem bottomMenuItem = new MenuItem("Bottom");
bottomMenuItem.setOnAction(new EventHandler() {
@Override
public void handle(ActionEvent actionEvent) {
root.setRight(null);
root.setBottom(getBottomVBox());
}
});

Menu menu = new Menu("Move text");
menu.getItems().add(rightMenuItem);
menu.getItems().add(bottomMenuItem);
menuBar.getMenus().addAll(menu);

return menuBar;
}

private HBox getRightHBox()
{
HBox hbox = new HBox();

VBox vbox = new VBox(50);
vbox.setPadding(new Insets(0, 20, 0, 20));
vbox.setAlignment(Pos.CENTER);

vbox.getChildren().addAll(new Text("Additional Info 1"),
new Text("Additional Info 2"), new Text("Additional Info 3"));
hbox.getChildren().addAll(new Separator(Orientation.VERTICAL), vbox);

return hbox;
}

private VBox getBottomVBox()
{
VBox vbox = new VBox();

HBox hbox = new HBox(20);
hbox.setPadding(new Insets(5));
hbox.setAlignment(Pos.CENTER);

hbox.getChildren().addAll(new Text("Footer Item 1")
, new Text("Footer Item 2"), new Text("Footer Item 3"));
vbox.getChildren().addAll(new Separator(), hbox);

return vbox;
}

private StackPane getCenterPane()
{
StackPane stackPane = new StackPane();
stackPane.setAlignment(Pos.CENTER);

final Rectangle rec = new Rectangle(200, 200);
rec.setFill(Color.DODGERBLUE);
rec.widthProperty().bind(stackPane.widthProperty().subtract(50));
rec.heightProperty().bind(stackPane.heightProperty().subtract(50));

stackPane.getChildren().addAll(rec);

return stackPane;
}

public static void main(String[] args)
{
Application.launch(args);
}
}


Подробнее здесь: https://stackoverflow.com/questions/169 ... en-changed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»