JavaFX динамически создает кнопки в GridPane - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь сделать JavaFX GridPane заполненным кнопками. У меня есть ArrayList с объектами, и для каждого из этих объектов должна быть создана кнопка. Тем не менее, размер ArrayList не всегда одинаков. Поэтому я до сих пор сделал этот код:

Часть JavaFX GridPane:

<AnchorPane fx:id="gridAnchorPane" minHeight="120.0" minWidth="450.0" prefHeight="120.0" prefWidth="550.0">
        <GridPane fx:id="peopleGridPane" hgap="5.0" layoutX="98.0" layoutY="43.0" translateX="1.0" translateY="1.0" translateZ="1.0" vgap="5.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        </GridPane>
    </AnchorPane>

Как видите, у меня ноль строк и столбцов, так как я намерен сделать их динамическими количеством и размером.

Контроллер для изготовления кнопок:

int GRIDWIDTH = //how many buttons are to fit in one row
for (int i = 0; i < people.size(); i++){
    peopleGridPane.add(personButton(people.get(i).getName()), i % GRIDWIDTH, i / GRIDWIDTH);
}

private Button personButton(String name) {
    button.setPrefSize(
            peopleGridPane.getWidth() / GRIDWIDTH,
            peopleGridPane.getHeight() / (people.size() / GRIDWIDTH)
    );

Используя этот метод, я получаю две проблемы.

  1. Когда у меня менее трех «людей», моя сетка выглядит так

enter image description here

  1. Когда я запускаю приложение, сетка выглядит так

enter image description here

Я в растерянности, поэтому все предложения приветствуются.

Для задачи 2 я сделал простой отдых:

Main:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


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

Контроллер:

private int GRIDWIDTH = 3;

@FXML
@Override
public void initialize(URL location, ResourceBundle resources) {
    refresh();
}

private void refresh() {


    for (int i = 0; i < people.size(); i++) {
        Button button = new Button(people.get(i).getName());
        button.setPrefSize(
                grid.getWidth() / GRIDWIDTH,
                grid.getHeight() / (people.size() / GRIDWIDTH)
        );
        button.setOnAction(event -> refresh());
        grid.add(button, i % GRIDWIDTH, i / GRIDWIDTH);
    }
}

public Controller() {
    people = new ArrayList<>();
    people.add(new Person("P1"));
    people.add(new Person("P2"));
    people.add(new Person("P3"));
    people.add(new Person("P4"));
}

.fxml файл:

<SplitPane dividerPositions="0.5" orientation="VERTICAL" prefHeight="201.0" prefWidth="240.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <items>
      <Pane prefHeight="200.0" prefWidth="200.0" />
      <GridPane fx:id="grid" alignment="center" hgap="10" vgap="10">
</GridPane>
   </items>
</SplitPane>

Перед нажатием кнопки.

enter image description here

После нажатия кнопки.

enter image description here

1 Ответ

0 голосов
/ 09 марта 2019

Я обнаружил оба решения проблем.

Обрезка границы

Причина, по которой кнопка защелкивалась в кнопке, заключалась в том, чтоЯ делю int a на int b, когда b> a, что приводит к 0, поскольку оба являются целыми числами.Когда я приведу числа к двойным, полученное число будет примерно 0,3333 или 0,66666, поэтому будет больше 0 и решит проблему.

Ширина кнопок равна 0

Проблема в том, что когда я впервые позвонил refresh(), все элементы на экране еще не «существовали».То есть они существовали, но они еще не были отображены на экране, что делало их ширину и высоту 0.0 или -1.0.Однако, если вы укажете конкретную высоту или ширину, например указанную или минимальную ширину / высоту, вы можете вызывать эти атрибуты, если высота или ширина окна <1. Таким образом, он все равно будет выглядеть не очень хорошо, когда выизмените размер окна, так как ширина и высота в этой точке просто статическая двойная, но, по крайней мере, она читаема. </p>

...