Badałem ten temat przez kilka dni i nie mogę znaleźć odpowiedzi, która rozwiązałaby moje pytanie, więc oto moje pierwsze pytanie dotyczące StackOverflow. Bądź rozważny!

Mam aplikację z bocznym menu i głównym panelem typu BorderPane. W tym głównym okienku jest TableView1. Zawartość tego panelu jest częścią Kontrolera 1 zwanego „arkuszem kontrolnym”. Kiedy wybieram element w TableView1 i klikam przycisk, pojawia się nowe okno z inną tabelą (TableView2), do której mogę dodać dane. Zawartość tego okna jest częścią Kontrolera 2 o nazwie „Tabela2”.

W Kontrolerze 1 mam kilka etykiet, które powinny być automatycznie aktualizowane po zamknięciu okna Kontroler 2 po dodaniu odpowiednich danych do TableView2. Aby to zrobić, postępowałem zgodnie z instrukcjami dotyczącymi przekazywania zmiennych zaktualizowanych w Kontrolerze 2 do Kontrolera 1 i wszystko wydaje się w porządku. Napisałem również „System.out.println” w metodzie setLabel w Kontrolerze 1 , aby potwierdzić, czy zmienna została przekazana do Kontrolera 1 i znajduje się w Pole etykiety - i tak, zostało przekazane. Pozornie tam jest. Jednak w samym interfejsie użytkownika pole etykiety nie jest aktualizowane.

Wygląda na to, że interfejs użytkownika w jakiś sposób się nie odświeża, ale sam kod, który się za nim znajduje, jest w porządku. Wszystkie wartości fx: id są przypisane, a wszystkie wartości fx: controller są również przypisane w pliku FXML.

Oto metoda w Kontrolerze 2 „Tabeli 2” do wywołania aktualizacji etykiety w „Arkuszu kontrolnym” Kontrolera 1

String data1 = Double.toString(lengthTD);               
            FXMLLoader loader = new FXMLLoader(getClass().getResource("CheckSheetUI.fxml"));
            AnchorPane mainPane  = (AnchorPane) loader.load();
            Checksheet cs = loader.getController();             
            cs.setLabel2(data1);

Oto ustawiacz w „arkuszu kontrolnym” Kontrolera 1

public void setLabel2(String data2) {
totalToDateBox.setText(data2);
System.out.println(totalToDateBox.getText()); // this does return the correct value in the console }

Jakieś pomysły, dlaczego etykieta w interfejsie użytkownika „ChecksSheetUI.fxml” nie jest aktualizowana? Wydaje mi się, że ma to związek z obsługą okienek granicznych, ponieważ postępowałem zgodnie z kodem w innym miejscu, a to nie działa.

Na marginesie (w razie potrzeby) mam nadrzędny kontroler, który zajmuje się dostosowywaniem tego, co jest zawarte w głównym panelu (ponieważ mam kilka niepowiązanych plików FXML, które są połączone).

public class FXMLDocumentController extends Main {

@FXML
public BorderPane mainPane;

@FXML
private Button btn_dmg27, btn_staySafe, btn_checkSheet;

@FXML
private void buttonAction(ActionEvent event) throws IOException {

    if(event.getSource() == btn_dmg27) 
    {
        Parent parent1 = FXMLLoader.load(getClass().getResource("dmg27UI.fxml"));           
        mainPane.setCenter(parent1);

    }
    else if(event.getSource() == btn_staySafe) 
    {
        Parent parent1 = FXMLLoader.load(getClass().getResource("staySafeUI.fxml"));            
        mainPane.setCenter(parent1);        

    }
    else if(event.getSource() == btn_checkSheet) 
    {
        Parent parent1 = FXMLLoader.load(getClass().getResource("CheckSheetUI.fxml"));          
        mainPane.setCenter(parent1);        
    } }
0
aerospaceguru 20 listopad 2019, 00:21
Czy faktycznie wyświetlasz nowo załadowaną scenę, czy jest to po prostu scena jednorazowa, którą utworzyłeś, aby mieć cel, do którego mają być przekazywane informacje, ale upuszczasz ją bez dodawania jej do sceny pokazanej w oknie?
 – 
fabian
20 listopad 2019, 09:41
Intencją jest ponowne załadowanie go do sceny kontrolera 1. Czy potrzebuję więcej kodu? Otworzyłem zupełnie nowe okno w poprzednich próbach i to zadziałało, ale nie mogłem wymyślić, jak ponownie załadować główny panel panelu granicznego. Miałem pusty wskaźnik nawet wtedy, gdy napisałem metodę pobierającą dla tego okienka, która jest zadeklarowana w osobnym kontrolerze.
 – 
aerospaceguru
20 listopad 2019, 11:17
To, czego potrzebujemy, aby pomóc Ci znaleźć Twój błąd, to minimalny powtarzalny przykład, który to pokazuje :)
 – 
kleopatra
20 listopad 2019, 13:00

2 odpowiedzi

Zgaduję, jak na telefonie komórkowym w drodze (pociąg). Sugerowałbym, abyś przechowywał swoje dane w ogólnym kontrolerze. Jeśli twoje podkontrolery zmienią tam wartości, inne elementy mogą to wyświetlić. Zajrzyj do MVC. - Kolejną rzeczą do rozważenia są „wiązania”. Powiąż tekst etykiety ze swoją zmienną „data”. Jak tylko zmienisz tę wartość, zostanie ona wyświetlona w GUI. Powodzenia.

-1
Budiman 20 listopad 2019, 12:54

Spróbuj wprowadzić jakiś tekst na etykiecie w programie scenebuilder, aby przetestować właściwości etykiety.

-1
Muhammad Ali 21 listopad 2019, 00:55