@ JoséPereda ссылка на общий код, основной класс: JFXApp.java

я есть пример трехмерного приложения (созданного на основе ссылки из образца 3DViewer Javafx), в котором есть таблица, созданная путем разметки Boxes и Panes:

Таблица центрирована относительно (0,0,0) координат, и камера изначально находится в положении -z.

Он имеет увеличение / уменьшение на основе положения камеры z от объекта. При увеличении / уменьшении объекта boundsInParent увеличивается / уменьшается, т.е. площадь лица увеличивается / уменьшается. Таким образом, идея состоит в том, чтобы поместить больше текста, когда у нас больше области (всегда ограничивающей лицо), и меньше текста или нет текста, когда область лица слишком мала. Я могу сделать это, используя эту иерархию узлов:

и изменение размера панели (и управление vBox и количеством текстов в нем) в соответствии с блоком при каждом увеличении / уменьшении.

Теперь проблема в том, что таблица boundsInParent дает неверные результаты (изображение стола показывать boundingBox в верхней части) всякий раз, когда текст добавляется в vBox только в первый раз. При дальнейшем увеличении / уменьшении выдает корректный boundingBox и не отключается.

Ниже приведен класс UIpane3D:

public class UIPane3D extends Pane
{
VBox textPane;

ArrayList<String> infoTextKeys = new ArrayList<>();
ArrayList<Text> infoTextValues = new ArrayList<>();

Rectangle bgCanvasRect = null;

final double fontSize = 16.0;   

public UIPane3D() {
    setMouseTransparent(true);
    textPane = new VBox(2.0)
}

public void updateContent() {
    textPane.getChildren().clear();
    getChildren().clear();

    for (Text textNode : infoTextValues) {
        textPane.getChildren().add(textNode);
        textPane.autosize();
        if (textPane.getHeight() > getHeight()) {
            textPane.getChildren().remove(textNode);
            textPane.autosize();

            break;
        }
    }

    textPane.setTranslateY(getHeight() / 2 - textPane.getHeight() / 2.0);

    bgCanvasRect = new Rectangle(getWidth(), getHeight());
    bgCanvasRect.setFill(Color.web(Color.BURLYWOOD.toString(), 0.10));
    bgCanvasRect.setVisible(true);

    getChildren().addAll(bgCanvasRect, textPane);
}


public void resetInfoTextMap()
{
    if (infoTextKeys != null || infoTextValues != null) 
    {
        try 
        {
            infoTextKeys.clear();
            infoTextValues.clear();     
        } catch (Exception e){e.printStackTrace();}
    }
}


public void updateInfoTextMap(String pKey, String pValue)
{
    int index = -1;
    boolean objectFound = false;

    for (String string : infoTextKeys) 
    {
        index++;
        if(string.equals(pKey))
        {
            objectFound = true;
            break;
        }
    }

    if(objectFound)
    {
        infoTextValues.get(index).setText(pValue.toUpperCase());
    }
    else
    {
        if (pValue != null) 
        {   
            Text textNode = new Text(pValue.toUpperCase());
            textNode.setFont(Font.font("Consolas", FontWeight.BLACK, FontPosture.REGULAR, fontSize));
            textNode.wrappingWidthProperty().bind(widthProperty());
            textNode.setTextAlignment(TextAlignment.CENTER);
            infoTextKeys.add(pKey);
            infoTextValues.add(textNode);
        }
    }
}

}

Код, который вызывается в конце после всех манипуляций:

public void refreshBoundingBox()
{
    if(boundingBox != null)
    {
        root3D.getChildren().remove(boundingBox);
    }

    PhongMaterial blueMaterial = new PhongMaterial();
    blueMaterial.setDiffuseColor(Color.web(Color.CRIMSON.toString(), 0.25));

    Bounds tableBounds = table.getBoundsInParent();
    boundingBox = new Box(tableBounds.getWidth(), tableBounds.getHeight(), tableBounds.getDepth());
    boundingBox.setMaterial(blueMaterial);
    boundingBox.setTranslateX(tableBounds.getMinX() + tableBounds.getWidth()/2.0);
    boundingBox.setTranslateY(tableBounds.getMinY() + tableBounds.getHeight()/2.0);
    boundingBox.setTranslateZ(tableBounds.getMinZ() + tableBounds.getDepth()/2.0);
    boundingBox.setMouseTransparent(true);

    root3D.getChildren().add(boundingBox);
}

Две вещи:

BoundsInParent таблицы 3D не обновляется должным образом при первом добавлении текстов.

Как правильно разместить текст на трехмерных узлах? Мне приходится много манипулировать, чтобы привести тексты по мере необходимости.

Код обменаВот.

Ответы на вопрос(0)

Ваш ответ на вопрос