Получить информацию от элемента VBox. JavaFX
На странице имеется VBox, в приложении можно добавить элемент в этот VBox. Элементом будет являться карточка автомобиля, как на auto.ru. Что мне нужно: по нажатию на элемент VBox, будет открываться страница, содержащая данные из элемента, на который мы нажали. Как мне получить информацию от элемента VBox?
Добавление элемента в VBox
AnchorPane pane = FXMLLoader.load(getClass().getResource("ad.fxml"));
vBox.getChildren().add(pane);
AdController
private void setAutoElementInLKS() {
try {
DataBaseHandler dbHandler = new DataBaseHandler();
ResultSet set = dbHandler.getAutoInfoForLKS();
for (int i = 0; i < count; i++) {
set.next();
}
if (set.next()) {
autoBrandModelLabel.setText(dbHandler.getBrandAndModel(set.getString(3)));
bodyTypeLabel.setText(dbHandler.getTableInfo("name","body_type", set.getString(4)));
transmissionLabel.setText(dbHandler.getTableInfo("name", "transmission", set.getString(5)));
engineLabel.setText(dbHandler.getEngineInfo(set.getString(6)));
driveLabel.setText(dbHandler.getTableInfo("name", "drive", set.getString(7)));
regionLabel.setText(dbHandler.getTableInfo("name", "region", set.getString(8)));
colorLabel.setText(dbHandler.getTableInfo("name", "color", set.getString(10)));
mileageLabel.setText(dbHandler.getTableInfo("mileage","auto", set.getString(1)) + " км");
yearLabel.setText(dbHandler.getTableInfo("year","auto", set.getString(1)));
priceLabel.setText(dbHandler.getTableInfo("price", "auto", set.getString(1)) + " р");
}
} catch (Exception e) {
e.printStackTrace();
}
}
Обработчик клика есть, я не понимаю что в нем написать
private void clickOnVBoxElement() {
for (Node child: firstVBox.getChildren()) {
child.setOnMouseClicked(mouseEvent -> {
});
}
}
Ответы (2 шт):
Сделал как обычно: через одно место. Где добавляется информация объявления запоминал id автомобиля, далее ставил его в id pane
AnchorPane pane = FXMLLoader.load(getClass().getResource("ad.fxml"));
pane.setId(AdController.getIdAuto());
firstVBox.getChildren().add(pane);
Абстрактный пример: окно с кнопкой и VBox, при нажатии на кнопку в VBox добавляется новая метка со случайным числом, и при создании же через лямбду привязывается обработчик нажатия. Лямбда имеет доступ к значению текста созданной метки (и вообще ко всем переменным метода, в котором она создана).
public class Controller {
@FXML
Button addItem;
@FXML
VBox vBox;
private final Random random = new Random();
@FXML
void onActionAddItem() {
String text = String.valueOf(random.nextInt(100));
Label label = new Label(text);
label.setOnMouseClicked(event -> {
new Alert(Alert.AlertType.INFORMATION, "Текст: " + text).show();
});
vBox.getChildren().add(label);
}
}
Более сложный пример:
Разделяем модель (информацию о машине), вью (панель отображения информации о машине), контроллер (всю логику). 100% чистоту реализации такого MVC правда не гарантирую :)
Наследуем панель отображения информации от AncorPane (или от любого другого контейнера), в конструктор передаем объект класса Car (в котором хранится все информация о машине, в примере ниже там только id, но можно добавить все нужные вам поля), внутри записываем во внутреннее поле, при клике по панели выводим значения из этого поля:
public class Controller {
@FXML
Button addItem;
@FXML
VBox vBox;
private final Random random = new Random();
@FXML
void onActionAddItem() {
Car car = new Car(random.nextInt(100));
CarPane carPane = new CarPane(this, car);
vBox.getChildren().add(carPane);
}
public void showCarInfo(Car car) {
new Alert(Alert.AlertType.INFORMATION, "id машины: " + car.getId()).show();
}
}
public class Car {
private final long id;
public Car(long id) {
this.id = id;
}
public long getId() {
return id;
}
}
public class CarPane extends AnchorPane {
private final Controller controller;
private final Car car;
public CarPane(Controller controller, Car car) {
this.controller = controller;
this.car = car;
getChildren().add(new Label("id машины: " + car.getId()));
setOnMouseClicked(this::onClick);
}
private void onClick(MouseEvent mouseEvent) {
controller.showCarInfo(car);
}
}