Sorry wenn ich nochmals nerve. Aber mir ist immer mal aufgefallen, dass beim Ändern bestimmter Filteroptionen manchmal keine automatische Aktualisierung der Filterung erfolgte. Erst nach Klicken auf Aktualisieren wurde die entsprechende Änderung der Filterung angewendet.
Da dieses Verhalten sehr unspezifisch war, also nur manchmal auftrat, konnte ich mir keinen Reim darauf machen, aber nachdem ich zuletzt die Änderungen am Filter der Kontoauszüge programmiert habe, ist mir der Grund dafür jetzt unvermittelt in den Sinn gekommen.
Die Aktualisierung erfolgt automatisch anhand der hasChanged()-Methode der Inputs, das funktioniert in der Regel problemlos, da aber Java logische Operationen abkürzt, wenn der Rest des Befehls nicht mehr zu Änderungen am logischen Wert führen kann, werden die hasChanged()-Methoden der Inputs, die nach einem anderen Input aufgerufen würden der true zurück gegeben hat nicht mehr aufgerufen und somit auch nicht zurück gesetzt. In der Regel ist das unproblematisch, da ja immer nur ein Wert zu einem bestimmten Zeitpunkt geändert wird, es gibt da aber Fälle in denen mehrere Werte auf einmal geändert werden.
Ändert man zum Beispiel jetzt einen Bereich, wie bei den Kontoauszügen den Zeitraum über die Drop-Down-Listen, ändern sich ja zeitgleich die Werte für von und bis, es wird aber durch den DelayListener nur eine Aktualisierung durch den von-Wert ausgelöst. Klickt man dann auf eine Checkbox wird die nächste Aktualisierung durch den bis-Wert ausgelöst, der ja noch nicht zurück gesetzt wurde, da dessen hasChanged()-Methode beim letzten Mal (wegen der Java-Abkürzung) nicht aufgerufen wurde. Zeitgleich wird auch der Wahrheitswert der Checkbox nicht auf den neuen Wert zurück gesetzt. Klickt man die Checkbox dann nochmals an, wird die Aktualisierung nicht ausgelöst, da der Wahrheitswert dann wieder dem gespeicherten Zustand entspricht, so dass hasChanged() false für die Checkbox zurück gibt. Man muss daher in diesem Fall auf Aktualisieren klicken, damit die geänderte Checkbox berücksichtigt wird.
Jetzt ist die Frage, wie man das am Besten löst? Ich würde eine neue statische Methode in de.willuhn.jameica.gui.input.Input vorschlagen:
Das ermöglicht es in den hasChanged()-Methoden in den Ansichten mit Filterung einfach Folgendes aufzurufen:
Vorteil ist ein vereinfachter Aufruf in den hasChanged()-Methoden der Filteransichten und dass damit alle hasChanged()-Methoden der übergebenen Inputs abgeklappert werden und somit auch für den nächsten Abruf zurück gesetzt sind.
Da dieses Verhalten sehr unspezifisch war, also nur manchmal auftrat, konnte ich mir keinen Reim darauf machen, aber nachdem ich zuletzt die Änderungen am Filter der Kontoauszüge programmiert habe, ist mir der Grund dafür jetzt unvermittelt in den Sinn gekommen.
Die Aktualisierung erfolgt automatisch anhand der hasChanged()-Methode der Inputs, das funktioniert in der Regel problemlos, da aber Java logische Operationen abkürzt, wenn der Rest des Befehls nicht mehr zu Änderungen am logischen Wert führen kann, werden die hasChanged()-Methoden der Inputs, die nach einem anderen Input aufgerufen würden der true zurück gegeben hat nicht mehr aufgerufen und somit auch nicht zurück gesetzt. In der Regel ist das unproblematisch, da ja immer nur ein Wert zu einem bestimmten Zeitpunkt geändert wird, es gibt da aber Fälle in denen mehrere Werte auf einmal geändert werden.
Ändert man zum Beispiel jetzt einen Bereich, wie bei den Kontoauszügen den Zeitraum über die Drop-Down-Listen, ändern sich ja zeitgleich die Werte für von und bis, es wird aber durch den DelayListener nur eine Aktualisierung durch den von-Wert ausgelöst. Klickt man dann auf eine Checkbox wird die nächste Aktualisierung durch den bis-Wert ausgelöst, der ja noch nicht zurück gesetzt wurde, da dessen hasChanged()-Methode beim letzten Mal (wegen der Java-Abkürzung) nicht aufgerufen wurde. Zeitgleich wird auch der Wahrheitswert der Checkbox nicht auf den neuen Wert zurück gesetzt. Klickt man die Checkbox dann nochmals an, wird die Aktualisierung nicht ausgelöst, da der Wahrheitswert dann wieder dem gespeicherten Zustand entspricht, so dass hasChanged() false für die Checkbox zurück gibt. Man muss daher in diesem Fall auf Aktualisieren klicken, damit die geänderte Checkbox berücksichtigt wird.
Jetzt ist die Frage, wie man das am Besten löst? Ich würde eine neue statische Methode in de.willuhn.jameica.gui.input.Input vorschlagen:
Code
/**
* Prueft ob sich der Wert mindestens eines uebergebenen Inputs seit dem letzten Aufruf von
* hasChanged() der Inputs geaendert hat.
* @param inputs Die Inputs deren hasChanged()-Methode abgefragt werden soll.
* @return true wenn der Wert mindestens eines Inputs sich seit dem letzten Aufruf von hasChanged()
* der Inputs geaendert hat.
*/
public static boolean valueHasChanged(Input... inputs)
{
boolean result = false;
try
{
for(Input i : inputs)
{
if(i != null)
{
result = i.hasChanged() || result;
}
}
} catch(Exception e)
{
Logger.error("unable to check change status",e);
result = true;
}
return result;
}
* Prueft ob sich der Wert mindestens eines uebergebenen Inputs seit dem letzten Aufruf von
* hasChanged() der Inputs geaendert hat.
* @param inputs Die Inputs deren hasChanged()-Methode abgefragt werden soll.
* @return true wenn der Wert mindestens eines Inputs sich seit dem letzten Aufruf von hasChanged()
* der Inputs geaendert hat.
*/
public static boolean valueHasChanged(Input... inputs)
{
boolean result = false;
try
{
for(Input i : inputs)
{
if(i != null)
{
result = i.hasChanged() || result;
}
}
} catch(Exception e)
{
Logger.error("unable to check change status",e);
result = true;
}
return result;
}
Das ermöglicht es in den hasChanged()-Methoden in den Ansichten mit Filterung einfach Folgendes aufzurufen:
Code
return Input.valueHasChanged(input1, input2, input2, usw.)