Ich habe ein kleines Programm, das ein Datum von einer JDateChooser-Komponente eingibt und die Anzahl der Tage von jetzt bis zum eingegebenen Datum berechnet. Es verwendet ein MVC-Muster, wurde in der Netbeans-IDE codiert und berechnet die korrekte Anzahl von Tagen, zeigt es aber nicht in "labelDays" an, was ein JLabel ist. Wenn ich labelDays.setText ("29") eintippe, funktioniert es und wenn ich den Wert von labelDays.getText() bekomme, wird die richtige Anzahl von Tagen in die Zukunft abgerufen, und strDays ist korrekt, aber das Etikett zeigt das aktualisierte nicht an Wert. Hier ist der Beispielcode:JLabel setText wird nicht aktualisiert, aber getText gibt den korrekten Wert zurück
model:
public class CountDownModel {
public LocalDate getCurrentDate() {
return LocalDate.now();
}
public long getDays(LocalDate futureDate) {
long daysBetween = DAYS.between(LocalDate.now(), futureDate);
if(daysBetween <= 0) {
return 0;
}
return daysBetween;
}
view:
public class CountDownView extends javax.swing.JFrame {
...
private CountDownController controller = new CountDownController();
public CountDownView() {
initComponents();
Date input = new Date();
Instant instant = input.toInstant();
Date output = Date.from(instant);
future_date.setDate(output);
}
private void button_calculateMouseClicked(java.awt.event.MouseEvent evt) {
Date futureDate;
futureDate = future_date.getDate();
String strDate = DateFormat.getDateInstance().format(futureDate);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d-MMM-yyyy");
LocalDate localDate = LocalDate.parse(strDate, formatter);
controller.setDays(localDate);
}
...
public void setDays(long days) {
String strDays = String.valueOf(days);
System.out.print("strDays:");
System.out.println(strDays);
String oldValue = labelDays.getText();
labelDays.setText(strDays);
labelDays.paintImmediately(labelDays.getVisibleRect());
String newValue = labelDays.getText();
System.out.print("oldValue:");
System.out.println(oldValue);
System.out.print("newValue:");
System.out.println(newValue);
System.out.println("================");
}
}
controller:
public class CountDownController {
public void startApplication() {
CountDownView view = new CountDownView();
view.setDays(0);
view.setVisible(true);
}
public void setDays(LocalDate futureDate) {
CountDownModel model = new CountDownModel();
CountDownView view = new CountDownView();
long longDays = model.getDays(futureDate);
if(longDays <= 0) {
longDays = 0;
}
view.setDays(longDays);
}
}
main:
public class DateCountDown {
public static void main(String[] args) {
// TODO code application logic here
CountDownController controller = new CountDownController();
controller.startApplication();
}
}
Output:
run:
strDays:0
oldValue:200
newValue:0
================
strDays:28
oldValue:200
newValue:28
================
Danke. Was muss ich tun, damit es funktioniert? PS: Ich frage mich, ob mein Fehler aufgrund der Art, wie ich meine MVC eingerichtet habe.
Philip
Variable paintImmediately und oldValue hinzugefügt. Etikett wird immer noch nicht aktualisiert. –
@ philip-stephens, aktualisiert dieses Label seinen Text zu einem späteren Zeitpunkt - oder bleibt es immer mit dem gleichen Wert? – arcquim
Es wird immer 0 angezeigt, es sei denn, ich habe es explizit in der Funktion festgelegt. –