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);
} }
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.
Spróbuj wprowadzić jakiś tekst na etykiecie w programie scenebuilder, aby przetestować właściwości etykiety.
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].