Я настоятельно рекомендую создать подходящую объектную модель для такого приложения. Каждый из ваших TitledPane
зависит от строки (используемой в качестве ключа на карте paths
), Path
, HttpMethod
и Operation
. Поэтому я бы начал с класса, инкапсулирующего эти данные.
Я назвал это Request
, но это может быть не самое подходящее имя.
import java.util.Objects;
import io.swagger.models.HttpMethod;
import io.swagger.models.Operation;
import io.swagger.models.Path;
public class Request {
private final String name ;
private final Path path ;
private final HttpMethod method ;
private final Operation operation ;
public Request(String name, Path path, HttpMethod method, Operation operation) {
super();
this.name = name;
this.path = path;
this.method = method;
this.operation = operation;
}
public String getName() {
return name;
}
public Path getPath() {
return path;
}
public HttpMethod getMethod() {
return method;
}
public Operation getOperation() {
return operation;
}
@Override
public int hashCode() {
return Objects.hash(name, path, method, operation);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Request other = (Request) obj;
return
Objects.equals(name, other.name) &&
Objects.equals(path, other.path) &&
Objects.equals(method, other.method) &&
Objects.equals(operation, other.operation) ;
}
}
Если вы хотите, чтобы это свойства, которые можно редактировать в пользовательском интерфейсе, вы должны представлять их с помощью свойств JavaFX вместо простых значений.
Теперь вы можете выполнять итерацию по структуре данных, возвращаемой Swagger API, и создавать простой список Request
s:
Swagger swagger = new SwaggerParser().read("https://petstore.swagger.io/v2/swagger.json");
Map<String, Path> paths = swagger.getPaths();
List<Request> requests = new ArrayList<>() ;
for (Map.Entry<String, Path> entry : paths.entrySet()) {
Path path = entry.getValue();
String pathName = entry.getKey() ;
for (Map.Entry<HttpMethod, Operation> methodOp : path.getOperationMap().entrySet()) {
HttpMethod method = methodOp.getKey() ;
Operation operation = methodOp.getValue() ;
requests.add(new Request(pathName, path, method, operation));
}
}
Чтобы отслеживать, какие элементы выбраны флажками, создайте Set
для хранения выбранных элементов:
Set<Request> selectedRequests = new HashSet<>();
, а затем каждый раз при создании проверки добавьте прослушиватель к его selectedProperty()
, чтобы добавить или удалить соответствующий Request
из этого набора:
for (Request req : requests) {
CheckBox chk = new CheckBox();
chk.setText(req.getMethod() + " : " + req.getName() + " : " + operation.getSummary());
chk.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
selectedRequests.add(req);
} else {
selectedRequests.remove(req);
}
});
}
Если вы хотите иметь возможность манипулировать состоянием флажков независимо от пользователя, Вы можете использовать ObservableSet
и добавить прослушиватель, который обновляет состояние флажка в другом направлении:
ObservableSet<Request> selectedRequests = FXCollections.observableSet();
и
for (Request req : requests) {
CheckBox chk = new CheckBox();
chk.setText(req.getMethod() + " : " + req.getName() + " : " + operation.getSummary());
chk.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
selectedRequests.add(req);
} else {
selectedRequests.remove(req);
}
});
selectedRequests.addListener((Change<? extends Request> c) ->
chk.setSelected(selectedRequests.contains(req)));
}
С помощью этой настройки вы можете изменить состояние флажка просто манипулированием изменение набора selectedRequests
, например:
Request req = ... ;
// checks the corresponding check box:
selectedRequests.add(req);
// unchecks the check box:
selectedRequests.remove(req);
// checks all check boxes:
selectedRequests.addAll(requests);
// unchecks all check boxes:
selectedRequests.clear();
, который может быть полезен для других элементов управления в пользовательском интерфейсе.
Теперь в обработчике вашей кнопки вы можете просто перебирать набор выбранных запрашивает и делает все, что вам нужно:
terminer.setOnAction(event -> {
selectedRequests.forEach(req -> {
// Do whatever you need with the Request object here
System.out.println(req.getMethod() + " : " + req.getName() + " : " + req.getOperation().getSummary());
});
});
Собрав все это вместе, оно выглядит так:
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import io.swagger.models.HttpMethod;
import io.swagger.models.Operation;
import io.swagger.models.Path;
import io.swagger.models.Response;
import io.swagger.models.Swagger;
import io.swagger.models.parameters.Parameter;
import io.swagger.parser.SwaggerParser;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableSet;
import javafx.collections.SetChangeListener.Change;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class GroupOfTitledPane extends Application {
@Override
public void start(Stage stage) throws MalformedURLException {
Swagger swagger = new SwaggerParser().read("https://petstore.swagger.io/v2/swagger.json");
Map<String, Path> paths = swagger.getPaths();
List<Request> requests = new ArrayList<>();
for (Map.Entry<String, Path> entry : paths.entrySet()) {
Path path = entry.getValue();
String pathName = entry.getKey();
for (Map.Entry<HttpMethod, Operation> methodOp : path.getOperationMap().entrySet()) {
HttpMethod method = methodOp.getKey();
Operation operation = methodOp.getValue();
requests.add(new Request(pathName, path, method, operation));
}
}
ObservableSet<Request> selectedRequests = FXCollections.observableSet();
// Create Root Pane.
VBox root = new VBox();
root.setPadding(new Insets(20, 10, 10, 10));
for (Request req : requests) {
Operation operation = req.getOperation();
CheckBox chk = new CheckBox();
chk.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
selectedRequests.add(req);
} else {
selectedRequests.remove(req);
}
});
selectedRequests.addListener((Change<? extends Request> c) ->
chk.setSelected(selectedRequests.contains(req)));
chk.setText(req.getMethod() + " : " + req.getName() + " : " + operation.getSummary());
TitledPane firstTitledPane = new TitledPane();
BorderPane bPane = new BorderPane();
bPane.setRight(chk);
firstTitledPane.setGraphic(bPane);
VBox content1 = new VBox();
content1.getChildren().add(new Label("Summary:" + operation.getSummary()));
content1.getChildren().add(new Label("Parameters number: " + operation.getParameters().size()));
for (Parameter parameter : operation.getParameters()) {
content1.getChildren().add(new Label(" - " + parameter.getName()));
}
content1.getChildren().add(new Label("Responses:"));
for (Map.Entry<String, Response> r : operation.getResponses().entrySet()) {
content1.getChildren().add(new Label(" - " + r.getKey() + ": " + r.getValue().getDescription()));
}
firstTitledPane.setContent(content1);
firstTitledPane.setExpanded(false);
root.getChildren().addAll(firstTitledPane);
}
ScrollPane scrollPane = new ScrollPane();
scrollPane.setFitToHeight(true);
scrollPane.setFitToWidth(true);
Button terminer = new Button("Terminer");
root.getChildren().addAll(terminer);
root.setAlignment(Pos.BOTTOM_RIGHT);
root.setSpacing(10);
scrollPane.setContent(root);
Scene scene = new Scene(scrollPane, 600, 400);
stage.setScene(scene);
stage.show();
terminer.setOnAction(event -> {
selectedRequests.forEach(req -> {
// Do whatever you need with the Request object here
System.out.println(req.getMethod() + " : " + req.getName() + " : " + req.getOperation().getSummary());
});
// this will clear all the checkboxes:
selectedRequests.clear();
});
}
public static void main(String[] args) {
Application.launch(args);
}
}