Как редактировать текст/изображение/кнопку на панели в JavaFX FXML

У меня ранее был вопрос о том, как я могу добавить панели в VBox в JavaFX FXML. Теперь мой вопрос: как я могу редактировать вещи внутри панели, которую я добавил? код для файлов FXML остается прежним. новый отредактированный код Java выглядит следующим образом:

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;

public class HotelReservationController implements Initializable{
@FXML
    private ScrollPane scrollPaneContent;
    @FXML
    private VBox vboxData;
    @FXML
    private AnchorPane cardAnchor;
    @FXML
    private HBox cardHBox;
    @FXML
    private Text cardTitle;

    @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
            URL cardURL = getClass().getResource("/application/Cards.fxml");
//      vboxData.getChildren().add(cardAnchor);
        for (int j = 0; j < 10; j++) {
            Parent cardAnchor=null;
            Parent cardHBox=null;
            Parent cardTitle=null;
            try {
                cardAnchor = FXMLLoader.load(cardURL);
                cardHBox= FXMLLoader.load(cardURL);
                cardTitle = FXMLLoader.load(cardURL);
                cardTitle.setText("test" + j);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            vboxData.getChildren().add(cardAnchor);
        }
        
        try {
            connectToHotel();
        } catch (ClassNotFoundException | SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
   
            
        }

Однако, когда я сделал это, у меня была следующая ошибка:

javafx.fxml.LoadException: 
/C:/Users///////bin/application/HotelReservation.fxml

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at application.Main.start(Main.java:18)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: javafx.scene.layout.AnchorPane cannot be cast to javafx.scene.text.Text
    at application.HotelReservationController.initialize(HotelReservationController.java:55)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
    ... 17 more

Как я могу добавить это текстовое поле и другие текстовые поля (и я думаю, что обработка области изображения и кнопки будет аналогична их обработке)?

Этот код не компилируется; Parent не имеет setText() метода. Вам нужно вызвать метод на контроллере, см. stackoverflow.com/questions/14187963/…

James_D 17.12.2020 19:59

Итак, насколько я понял, мне нужен контроллер для Cards.fxml, в этом контроллере я создаю метод для динамического изменения текста и просто вызываю этот метод. затем я загружаю атрибут cardAnchor, и тогда он должен автоматически установить его?

TestUser1 17.12.2020 20:29

Что означает «редактировать текст/изображение/кнопку»? Что означает редактирование кнопки? Кто делает редактирование, это конечный пользователь или что-то в вашей программе? Можете ли вы привести пример редактирования и что он делает для каждой из вещей, которые вы хотите сделать редактируемыми? Пример редактируемой пользователем метки здесь, но я не думаю, что это то, о чем вы действительно спрашиваете.

jewelsea 17.12.2020 21:29

Итак, у меня есть макет, который выглядит как карта, и я хочу динамически добавить его в VBox в области прокрутки. на карточке есть вид изображения и 4 текста: для заголовка, местоположения, рейтинга и описания, а также есть кнопка, при нажатии которой открывается новый вид. в связанном вопросе я спросил, как динамически добавлять карты в VBox (весь код есть), и это сработало, как сказал @James_D. но затем, когда я попытался отредактировать текст динамически (я хочу извлечь данные из базы данных, а затем отредактировать каждое поле в цикле For, но до сих пор я только тестирую, поэтому я еще не подключил его// не работа) .

TestUser1 17.12.2020 21:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
233
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, изучив это, принимая во внимание ответ @James_D, все, что мне нужно было сделать, это создать контроллер для Cards.fxml, и в этот контроллер я должен добавить данные.

мой был

public class CardsController implements Initializable{
@FXML
    private Text cardTitle;
    @FXML
    private Text cardLocation;
    @FXML
    private Text cardRating;
    @FXML
    private Text cardDescription;
    @FXML
    private Button cardDetails;
    @FXML
    private ImageView cardPhoto;
    @FXML
    private HBox cardHBox;
    @FXML
    private AnchorPane cardAnchor;
    
    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // TODO Auto-generated method stub
        cardTitle.setText("Test Title");
        cardLocation.setText(" Test Location" );
        cardRating.setText("5");
        cardDescription.setText("This is only for testing, data should be imported later");
    }
}

Теперь, кроме контроллера, в классе HotelReservationController, особенно внутри цикла for, в котором я отображал все карты, я должен был сделать следующее:

FXMLLoader loader = new FXMLLoader(getClass().getResource("/application/Cards.fxml"));
                loader.load();

моя проблема была с loader.load(). метод initialize не вызывается, если я не загружаю загрузчик, и это вызывает у меня много проблем.

Надеюсь, это поможет другим невежественным людям, таким как я, в будущем.

Другие вопросы по теме