Группа JavaFX в панели макета, похоже, имеет неправильные границы

У меня есть VBox в Dialog/DialogPane, а дочерний элемент Group (группа B) обертывает Group (группа A) из Shapes. Группа A слишком велика для экрана, поэтому я добавляю преобразование Scale к группе B, чтобы уменьшить ее размер, и это работает отлично. За исключением того, что окно как будто думает, что Node все равно огромное, а диалог простирается далеко за пределы экрана. Родительские границы, похоже, меняются после применения масштаба, но не границы макета. Как масштабировать Group, чтобы он повлиял на макет?

Изменить: я только что кратко описал проблему с проектом Eclipse, размещенным на BitBucket: http://v.gd/0trUMv

Вы можете нажать кнопку переключения, чтобы переключиться между большим и маленьким. Обратите внимание, что преобразование применяется до добавления группы. Переключение на большой круг показывает, что макет учитывает полные размеры дочернего узла. Вопрос в том, как переопределить это поведение без изменения свойств дочернего узла. Желаемое поведение состоит в том, чтобы границы макета охватывали только маленький круг.

2-е редактирование: вот встроенный код.

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Shape;
import javafx.scene.transform.Scale;
import javafx.scene.transform.Transform;
import javafx.stage.Stage;

public class Demo extends Application {

    private Scene scene = null;
    private static final String mksml = "make small";
    private static final String mkbig = "make big";
    private static final Transform smallScale = new Scale(0.2, 0.2);

    @Override
    public void start(Stage primaryStage) throws Exception {
        Shape bigGraphic = new Circle(500);
        Group originalBigGroup = new Group(bigGraphic);
        Group transformedGroup = new Group(originalBigGroup);
        transformedGroup.getTransforms().add(smallScale);
        Button xformToggle = new Button(mkbig);
        xformToggle.setOnMouseClicked((MouseEvent mouseEvent) -> {
            switch(xformToggle.getText()) {
            case mkbig:
                transformedGroup.getTransforms().clear();
                xformToggle.setText(mksml);
                break;
            case mksml:
                transformedGroup.getTransforms().add(smallScale);
                xformToggle.setText(mkbig);
            }
        });
        VBox layout = new VBox(xformToggle, transformedGroup);
        scene = new Scene(layout);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

person Travis Well    schedule 17.10.2015    source источник
comment
Можете ли вы опубликовать свой код?   -  person James_D    schedule 17.10.2015
comment
@ james-d, да, завтра я опубликую короткую демонстрацию проблемы.   -  person Travis Well    schedule 19.10.2015
comment
У меня есть обходной путь, но я думаю, что он уродлив, так как включает узел группы между преобразованным узлом и VBox. v.gd/iPHjPt Я все еще ищу элегантное решение, которое можно было бы принять в качестве ответа.   -  person Travis Well    schedule 19.10.2015


Ответы (1)


Что-то вроде этого, группа не позиционирует и не организует своих дочерних элементов, поэтому, если она начинается с 1000*1000, она закончится 1000*1000, если вы явно не уменьшите ее. Следовательно, VBox остается прежним, и вы получаете то же измерение.

Это подходит?

person Elltz    schedule 17.10.2015
comment
Elltz, правда, Group не стала бы менять размеры дочерних узлов. Вот почему должна быть разница между границами в локальной и родительской границами. Я не уверен, что то, что вы предлагаете, может быть исправлением. Мне не нужно менять размеры дочернего элемента, чтобы изменить размеры родителя, иначе я бы сказал, что в графе сцены есть ошибка. - person Travis Well; 19.10.2015