Guten Abend allerseits.
Ich beschäftige mich nach einer kleinen Pause mal wieder mit meinem jCLS-Projekt und hänge vor einem Problem, das ich partout nicht verstehe. Vielleicht kommt eine unverbrauchte Seele da eher drauf als ich...findet jemand das Problem?
Das Problem äußert sich folgendermaßen:
Ich habe einige Tutorials in mein Programm eingebaut, die den Benutzer durch das Programm führen und die Bedienung erklären.
Man öffne das Hilfe-Menü > Tutorium > Erste Schritte. Es öffnet sich ein neues Fenster mit etwas Text zum Lesen und drei Buttons: "Zurück", "Abbrechen", "Weiter". Man klicke ein paar Mal auf "Weiter". Ein paar Mal klicken, und der Weiterbutton ist ausgegraut - an dieser Stelle soll der Benutzer eine Aufgabe erledigen. Zwischendurch hat sich der linke Teil des Fensters farblich etwas geändert - dem Benutzer soll so klargemacht werden, worauf er seine Aufmerksamkeit richten soll.
Nun öffne man im eingefärbtem Bereich das Kontextmenü mit einem Rechtsklick. Der Menüeintrag, den der Benutzer nun anklicken soll, ist ebenfalls eingefärbt.
Soweit funktioniert alles so, wie es soll.
Nun erledigt der Benutzer die Aufgabe (erstellt eine neue Bibliothek), und kann wieder auf "Weiter" klicken und die nächste Aufgabe wartet. Jetzt soll der Benutzer wieder das Rechtsklickmenü an besagter Stelle öffnen und ein anderer Menüeintrag soll farblich abgehoben werden - und genau das passiert merkwürdigerweise nicht.
Im Programm funktioniert es so (oder soll so funktionieren):
Es gibt eine Klasse VcPlayerMaster. Diese Klasse klinkt sich in die View und den Controller ein und übernimmt in beiden Klassen verschiedene Steuerfunktionen. Den verschiedenen Viewelementen kann ein VcPlayerMaster-Objekt über ein Interface Befehle erteilen (Enum SlaveCommand), worauf hin diese z.B. diese Umfärbung vornehmen.
Außerdem klinkt sich das VcPlayerMasterobjekt in den Controller ein und prüft die Kommandos, die von der View hereinkommen. Soll der Benutzer eine Aufgabe erledigen und macht stattdessen irgendwelchen Blödsinn, werden die Kommandos einfach verworfen.
Das Kontextmenü, um das es hier geht, ist die Klasse LibrarybrowserConextmenu. Diese ist so ein eigenständiges Viewelement, das von einem VcPlayerMasterobjekt direkt befehligt werden kann. Das Umfärben selbst geschieht dadurch, daß einem MenuItem einfach eine neue StyleClass übergebügelt wird. Um das Umfärben rückgängig zu machen werden einfach alle MenuItems neu erstellt (es scheint da leider einen Bug mit der Clearmethode zu geben, und ich will nicht die vollständige Styleklasse von MenuItem mit der Vererbungshierarchie zusammenpuzzeln, das ist leider nicht gerade wenig).
Die Methode, die vom VcPlayerMasterobjekt aufgerufen wird ist die hier (Klasse LibrarybrowserContextmenu ab Zeile 224):
Ich habe mal in alle drei Cases einen Breakpoint gesetzt, und alle Cases werden in der erwartete Reihenfolge angegangen. Es haut mir auf jeden Fall kein CLEAR ungewollt dazwischen oder so. Es ist einfach so, als ob der Ausdruck miNewLibrarypage.getStyleClass().add("distinct-menu-item"); schlicht nicht ausgefürt wird - angesprungen wird er jedenfalls.
Was mir jedoch aufgefallen ist (und was ich mir genauso wenig erklären kann): Erledigt man die erste Aufgabe und klickt auf "Zurück", ist die Einfärbung wieder raus (so soll es auch sein). Klickt man jedoch wieder auf "Vorwärts", so müßte die erste MenuItemmarkierung (die ja im normalen Durchlauf funktioniert), auch wieder da sein - sie bleibt aber weg.
Es ist so, als ob ich nur ein einziges Mal ein MenuItem umfärben könnte. Wenn man das Tutorial abbricht und neu startet, wird auch das erste (zunächst funktionierende) MenuItem nicht mehr eingefärbt. Ich habe keine Ahnung, warum.
Aber: das folgende funktionionert auch:
Soll heißen: Elemente mehrmals umfärben ist eigentlich kein Problem.
Danke schonmal für die Kenntnisnahme bis hierher. Hat irgendjemand eine Idee, was das Problem sein könnte? Ich habe absolut keine Idee mehr.
Der aktuelle Quellcode ist hier: https://sourceforge.net/projects/jcls/files/jCLS debug discussion.zip/download
Ich beschäftige mich nach einer kleinen Pause mal wieder mit meinem jCLS-Projekt und hänge vor einem Problem, das ich partout nicht verstehe. Vielleicht kommt eine unverbrauchte Seele da eher drauf als ich...findet jemand das Problem?
Das Problem äußert sich folgendermaßen:
Ich habe einige Tutorials in mein Programm eingebaut, die den Benutzer durch das Programm führen und die Bedienung erklären.
Man öffne das Hilfe-Menü > Tutorium > Erste Schritte. Es öffnet sich ein neues Fenster mit etwas Text zum Lesen und drei Buttons: "Zurück", "Abbrechen", "Weiter". Man klicke ein paar Mal auf "Weiter". Ein paar Mal klicken, und der Weiterbutton ist ausgegraut - an dieser Stelle soll der Benutzer eine Aufgabe erledigen. Zwischendurch hat sich der linke Teil des Fensters farblich etwas geändert - dem Benutzer soll so klargemacht werden, worauf er seine Aufmerksamkeit richten soll.
Nun öffne man im eingefärbtem Bereich das Kontextmenü mit einem Rechtsklick. Der Menüeintrag, den der Benutzer nun anklicken soll, ist ebenfalls eingefärbt.
Soweit funktioniert alles so, wie es soll.
Nun erledigt der Benutzer die Aufgabe (erstellt eine neue Bibliothek), und kann wieder auf "Weiter" klicken und die nächste Aufgabe wartet. Jetzt soll der Benutzer wieder das Rechtsklickmenü an besagter Stelle öffnen und ein anderer Menüeintrag soll farblich abgehoben werden - und genau das passiert merkwürdigerweise nicht.
Im Programm funktioniert es so (oder soll so funktionieren):
Es gibt eine Klasse VcPlayerMaster. Diese Klasse klinkt sich in die View und den Controller ein und übernimmt in beiden Klassen verschiedene Steuerfunktionen. Den verschiedenen Viewelementen kann ein VcPlayerMaster-Objekt über ein Interface Befehle erteilen (Enum SlaveCommand), worauf hin diese z.B. diese Umfärbung vornehmen.
Außerdem klinkt sich das VcPlayerMasterobjekt in den Controller ein und prüft die Kommandos, die von der View hereinkommen. Soll der Benutzer eine Aufgabe erledigen und macht stattdessen irgendwelchen Blödsinn, werden die Kommandos einfach verworfen.
Das Kontextmenü, um das es hier geht, ist die Klasse LibrarybrowserConextmenu. Diese ist so ein eigenständiges Viewelement, das von einem VcPlayerMasterobjekt direkt befehligt werden kann. Das Umfärben selbst geschieht dadurch, daß einem MenuItem einfach eine neue StyleClass übergebügelt wird. Um das Umfärben rückgängig zu machen werden einfach alle MenuItems neu erstellt (es scheint da leider einen Bug mit der Clearmethode zu geben, und ich will nicht die vollständige Styleklasse von MenuItem mit der Vererbungshierarchie zusammenpuzzeln, das ist leider nicht gerade wenig).
Die Methode, die vom VcPlayerMasterobjekt aufgerufen wird ist die hier (Klasse LibrarybrowserContextmenu ab Zeile 224):
Java:
@Override
public void receiveCommand(SlaveCommand... sCommands) {
for (SlaveCommand command : sCommands) {
switch (command) {
case CLEAR:
rebuildMenu(); //Cause a bug in clearing style class, we renew simply all menu items.
break;
case MARK_NEW_LIBRARY_COMMAND:
miNewLibrary.getStyleClass().add("distinct-menu-item");
break;
case MARK_NEW_LIBRARYPAGE_COMMAND:
miNewLibrarypage.getStyleClass().add("distinct-menu-item");
break;
default:
}
}
}
Ich habe mal in alle drei Cases einen Breakpoint gesetzt, und alle Cases werden in der erwartete Reihenfolge angegangen. Es haut mir auf jeden Fall kein CLEAR ungewollt dazwischen oder so. Es ist einfach so, als ob der Ausdruck miNewLibrarypage.getStyleClass().add("distinct-menu-item"); schlicht nicht ausgefürt wird - angesprungen wird er jedenfalls.
Was mir jedoch aufgefallen ist (und was ich mir genauso wenig erklären kann): Erledigt man die erste Aufgabe und klickt auf "Zurück", ist die Einfärbung wieder raus (so soll es auch sein). Klickt man jedoch wieder auf "Vorwärts", so müßte die erste MenuItemmarkierung (die ja im normalen Durchlauf funktioniert), auch wieder da sein - sie bleibt aber weg.
Es ist so, als ob ich nur ein einziges Mal ein MenuItem umfärben könnte. Wenn man das Tutorial abbricht und neu startet, wird auch das erste (zunächst funktionierende) MenuItem nicht mehr eingefärbt. Ich habe keine Ahnung, warum.
Aber: das folgende funktionionert auch:
Java:
case MARK_NEW_LIBRARY_COMMAND:
miNewLibrary.getStyleClass().add("distinct-menu-item");
rebuildMenu();
miNewLibrary.getStyleClass().add("distinct-menu-item");
break;
Danke schonmal für die Kenntnisnahme bis hierher. Hat irgendjemand eine Idee, was das Problem sein könnte? Ich habe absolut keine Idee mehr.
Der aktuelle Quellcode ist hier: https://sourceforge.net/projects/jcls/files/jCLS debug discussion.zip/download