Вы можете попробовать использовать HBox в качестве контейнера для ваших прямоугольников.Он автоматически разместит ваши прямоугольники рядом друг с другом и позволит вам контролировать, сколько места вы хотите между ними.
Добавление прямоугольников в FXML
<HBox fx:id="rectangleContainer" spacing="2" alignment="BOTTOM_LEFT" >
<Rectangle fill="blue" width="10" height="50"/>
<Rectangle fill="blue" width="10" height="20"/>
<Rectangle fill="blue" width="10" height="10"/>
<Rectangle fill="blue" width="10" height="40"/>
<Rectangle fill="blue" width="10" height="50"/>
<Rectangle fill="blue" width="10" height="60"/>
<Rectangle fill="blue" width="10" height="30"/>
<Rectangle fill="blue" width="10" height="30"/>
<Rectangle fill="blue" width="10" height="20"/>
<Rectangle fill="blue" width="10" height="10"/>
<Rectangle fill="blue" width="10" height="50"/>
<Rectangle fill="blue" width="10" height="60"/>
</HBox>
Этот FXML даст следующий результат: .
Добавление прямоугольников программным способом
Если вы хотите добавить прямоугольники программным способом, вам просто нужна ссылка на HBox и выполните что-то вроде следующего.
@FXML
private HBox rectangleContainer;
...
for (int i = 0; i < numBands; i++) {
Rectangle rect = new Rectangle(rectangleWidth, rectangleHeight);
rect.setFill(Color.BLUE);
rectangleContainer.getChildren().add(rect);
}
Контейнер с фиксированной шириной
Предположим, у вас естьHBox шириной 740 пикселей, и вы хотите заполнить его 10 прямоугольниками, разделенными пробелом в 10 пикселей.
int numBands = 10;
double spacing = 10.0;
double totalSpacing = spacing * (numBands-1);
double rectangleWidth = (rectangleContainer.getPrefWidth()-totalSpacing) / numBands;
for (int i = 0; i < numBands; i++) {
Rectangle rect = new Rectangle(rectangleWidth, Math.random()*500); //random height. replace with the value you want
rect.setFill(Color.BLUE);
rectangleContainer.getChildren().add(rect);
}
Это результат:
Надеюсь, этопомогает.
Обновление:
Извините, я не понял, что вы не можете использовать HBox.Я думаю, что проблема на изображении 1 в том, что расстояние между прямоугольниками отсутствует.Вы можете попробовать изменить прямоугольник X следующим образом:
for (int i = 0; i < numBands; i++) {
Rectangle rectangle = new Rectangle((rectWidth+2) * i, 0,
rectWidth, rectHeight);
rectangle.setFill(Color.hsb(startHue, 1.0, 1.0, 1.0));
rectangles[i] = rectangle;
vizPane.getChildren().add(rectangle);
}
Я использовал интервал 2. Это, конечно, может привести к тому, что AnchorPane увеличит свою ширину, чтобы она соответствовала всем прямоугольникам и интервалу.Если вы не хотите этого, вы должны учитывать расстояние при расчете ширины прямоугольников.