Plugin-Entwicklung: Eigene Icons mit getProgramTableIcons

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.

BBCode ist eingeschaltet
[img] ist eingeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Ansicht erweitern Die letzten Beiträge des Themas: Plugin-Entwicklung: Eigene Icons mit getProgramTableIcons

von Til » 08 Okt 2004, 12:36

Ja, der Umweg ist noch nötig.

von platin(x) » 08 Okt 2004, 09:09

Bevor ich jetzt lang rumprobier frag ich lieber ;)
Ist der Umweg über mark()/unmark() noch notwendig wenn ein Icon für die bereits dargestellte Programmtabelle angezeigt werden soll?
Im Grunde weis die Tabelle von dem neuen Icon ja nichts.

von henryk » 16 Sep 2004, 14:19

Moin,

Ahh, nevermind. :oops: Aus irgendeinem Grund wurde der Source doch nicht aktualisiert obwohl ich das eignetlich angefordert hatte. Jetzt geht es.

--
Henryk Plötz
Grüße von der Ostsee

von henryk » 16 Sep 2004, 13:44

Moin,
Til hat geschrieben:Mit der aktuellen CVS-Version sollte es gehen. Wenn nicht, dann melde dich nochmal...
meld. Ich hab jetzt zwischen markieren und entmarkieren eine Sekunde Pause eingefügt und kann in der Programmtabelle wunderbar sehen wie alle Sendungen der Reihe nach Aufleuchten. Das Icon ändert sich trotzdem nicht.

Ich bin mir zwar nicht sicher ob ich das alles richtig verstanden habe, aber soweit ich sehe sollte die Magie in ProgramPanel.stateChanged() passieren, richtig? Das ruft dann getPluginIcons() und holt sich die Icons neu. getPluginIcons() wird aber nur einmal am Anfang beim Aufbauen der Programmtabelle aufgerufen und später nicht wieder (wie ein System.out.println() zeigt; nützliches Debugging-Tool, das ;-). Weiter nachgesehen wird ProgramPanel.stateChanged() überhaupt gar nie aufgerufen, was vermutlich daran liegt dass ProgramPanel.addNotify() nie aufgerufen wird und das Program daher auch nie das ProgramPanel als ChangeListener kennenlernt.

--
Henryk Plötz
Grüße von der Ostsee

von Til » 16 Sep 2004, 10:25

Sorry. Ich hatte was vergessen, so dass die Icons nicht neu geholt wurden, wenn die Sendung nicht in der Programmtabelle war. Wenn sie sonst wo angezeigt wurde, hat es funktioniert...

Mit der aktuellen CVS-Version sollte es gehen. Wenn nicht, dann melde dich nochmal...

von bodo » 16 Sep 2004, 06:41

Damit funktioniert das nich? Ich hab aber eigentlich da irgendwo was gesehen, das Til was geändert hat dafür ?!

Til?

Re: Plugin: Eigene Icons auch asynchron?

von henryk » 15 Sep 2004, 22:24

Moin,
Til hat geschrieben:In der nächsten Version sollte das mit dem Markieren/Entmarkieren also funktionieren.
Kann man das schon irgendwo sehen zum Ausprobieren? Also ich hab das CVS für das Projekt von Sourceforge ausgecheckt, aber damit funktioniert es zum Beispiel nicht.

--
Henryk Plötz
Grüße von der Ostsee

Re: Plugin: Eigene Icons auch asynchron?

von henryk » 06 Sep 2004, 15:24

Moin,
Til hat geschrieben:OK. Sorry. Das war mein Fehler. Momentan funktioniert das noch nicht, weil die Icons gecached werden. Ich habe jetzt jedoch eingebaut, dass sie neu geholt werden, wenn sich das Program geändert hat (also z.B. markiert wurde). In der nächsten Version sollte das mit dem Markieren/Entmarkieren also funktionieren.
Hmm, ok, danke. Ich frage dann jetzt also TVBrowser.VERSION ab und wenn das kleinergleich 1.0 RC5 ist werfe ich meinen Hack an: Ein Timer wird gestartet der alle 5s nachschaut ob in der letzten Zeit Klassifikationen eingegangen sind. Und wenn dem so ist wird das erwähnte forceRepaintAll() angeworfen. Ansonsten halt mark/unmark.

Damit kann ich leben.

--
Henryk Plötz
Grüße aus Berlin

Re: Plugin: Eigene Icons auch asynchron?

von platin(x) » 06 Sep 2004, 14:45

Til hat geschrieben:
platin(x) hat geschrieben:Gibst du hier:

Code: Alles auswählen

public String getMarkIconName();
null zurück? Das wäre dann das Problem...
Nein, das ist hier nicht das Problem. Es geht hier um die Plugin-Icons (die, die unter der Zeit stehen) und nicht um das Markierungs-Icon (das Icon rechts unten). Das Markieren/Entmarkieren wird hier nur als Trick benutzt um ein Neumalen der Sendung auszulösen.
Jupp, aber wenn das in der Javadoc stimmt und er null zurückliefert ist der Trick ausgehebelt ;)

von henryk » 06 Sep 2004, 13:17

Moin,
platin(x) hat geschrieben:Gibst du hier:

Code: Alles auswählen

public String getMarkIconName();
null zurück? Das wäre dann das Problem...
Jupp, hatte ich. Aber auch wenn ich den Namen eines Icons zurückgebe bringt das nichts.

--
Henryk Plötz
Grüße aus Berlin

Re: Plugin: Eigene Icons auch asynchron?

von Til » 06 Sep 2004, 08:43

henryk hat geschrieben:
Til hat geschrieben:
henryk hat geschrieben:Deshalb: Ist ein einfacher Weg vorgesehen die Markierungen asynchron zu verteilen?
Ja, sowas ist möglich. Es gibt zwar keine direkte Möglichkeit, eine Aktualisierung auszulösen, aber du kannst die Sendung markieren und sofort wieder entmarkieren. Dann wird die Sendung neu gemalt, dabei werden von deinem Plugin die Icons abgefragt.
Hat das schonmal jemand erfolgreich getan? Ich bin jetzt nämlich soweit dass mein Plugin im wesentlichen das tut, die richtigen Icons werden aber nicht angezeigt.
OK. Sorry. Das war mein Fehler. Momentan funktioniert das noch nicht, weil die Icons gecached werden. Ich habe jetzt jedoch eingebaut, dass sie neu geholt werden, wenn sich das Program geändert hat (also z.B. markiert wurde). In der nächsten Version sollte das mit dem Markieren/Entmarkieren also funktionieren.
platin(x) hat geschrieben:Gibst du hier:

Code: Alles auswählen

public String getMarkIconName();
null zurück? Das wäre dann das Problem...
Nein, das ist hier nicht das Problem. Es geht hier um die Plugin-Icons (die, die unter der Zeit stehen) und nicht um das Markierungs-Icon (das Icon rechts unten). Das Markieren/Entmarkieren wird hier nur als Trick benutzt um ein Neumalen der Sendung auszulösen.

von platin(x) » 06 Sep 2004, 00:11

Gibst du hier:

Code: Alles auswählen

public String getMarkIconName();
null zurück? Das wäre dann das Problem...
Returns the name of the file, containing your mark icon (in the jar-File).

This icon is used for marking programs in the program table.

Return null if your plugin does not provide this feature.

See Also:
.getMarkIcon()

Re: Plugin: Eigene Icons auch asynchron?

von henryk » 05 Sep 2004, 23:33

Moin,
henryk hat geschrieben: Hat das schonmal jemand erfolgreich getan? Ich bin jetzt nämlich soweit dass mein Plugin im wesentlichen das tut, die richtigen Icons werden aber nicht angezeigt.
Ok, ein paar Experimente weiter:
Die folgenden Ansätze funktionieren nicht:

Code: Alles auswählen

public void refreshProgram(Program program)
{ 
    program.mark();
    program.unmark();
}
sowie

Code: Alles auswählen

public void refreshProgram(Program program)
{ 
    tvdataservice.MutableProgram mprog = (tvdataservice.MutableProgram) program;
    mprog.markAsOnAir(mprog.isOnAir());
}
(Ja, ich weiss, das ist nichtmal annähernd die feine englische Art, aber ich wollte halt irgendwie das fireStateChanged() auslösen.)

Das folgende geht aber, naja irgendwie jedenfalls:

Code: Alles auswählen

refreshProgram(Program program)
{ 
    tvbrowser.ui.mainframe.MainFrame.getInstance().getProgramTableScrollPane().forceRepaintAll();      
}
Es macht etwa das was es soll: Die Bewertungen werden im Hintergrund berechnet und sobald eine Bewertung bereit ist erscheint sie auch in der Programmtabelle. Allerdings ist das nicht direkt minimalinvasiv und produziert einiges an Overhead. (Lies: Es ist nicht schneller als vorher, eher langsamer.)

Ich bin versucht das nicht-Funktionieren des ersten Ansatzes als Bug im TV-Browser zu bezeichnen. Zustimmung? Kann man das beheben?

--
Henryk Plötz
Grüße aus Berlin

Re: Plugin: Eigene Icons auch asynchron?

von henryk » 05 Sep 2004, 20:06

Moin,
Til hat geschrieben:
henryk hat geschrieben:Deshalb: Ist ein einfacher Weg vorgesehen die Markierungen asynchron zu verteilen?
Ja, sowas ist möglich. Es gibt zwar keine direkte Möglichkeit, eine Aktualisierung auszulösen, aber du kannst die Sendung markieren und sofort wieder entmarkieren. Dann wird die Sendung neu gemalt, dabei werden von deinem Plugin die Icons abgefragt.
Hat das schonmal jemand erfolgreich getan? Ich bin jetzt nämlich soweit dass mein Plugin im wesentlichen das tut, die richtigen Icons werden aber nicht angezeigt.

Reihenfolge der Aktionen: getProgramTableIcons wird aufgerufen und stellt fest dass die Bewertung für diese Sendung noch nicht zwischengespeichert wurde. Dann gibt es ein null (oder ein Fragezeichen-Icon, völlig egal) zurück. Später (ich mache das noch manuell, weil es sich dann einfacher testen lässt) veranlasse ich die tatsächliche Berechnung der Bewertung in einem eigenen Thread. Ich sehe dann über ein paar strategisch verteilte System.out.println()s auch dass folgendes passiert: Die Bewertung wird berechnet und zwischengespeichert, dann ruft der andere Thread einen Callback bei mir im Plugin auf und der macht erfolgreich ein mark()/unmark() auf das program-Objekt (ich bilde mir auch ein die Sendung einmal kurz rot aufleuchten gesehen zu haben). Weiter passiert nichts, insbesondere ändert sich das Icon das von meinem Plugin angezeigt wird nicht.

Wenn ich im TV-Browser dann einen Tag vor und wieder zurück gehe, die Sendungen also wirklich alle neu gezeichnet werden, dann ist auch das geänderte Icon da.

--
Henryk Plötz
Grüße aus Berlin

Re: Plugin: Eigene Icons auch asynchron?

von Til » 01 Sep 2004, 11:05

henryk hat geschrieben:Deshalb: Ist ein einfacher Weg vorgesehen die Markierungen asynchron zu verteilen? D.h. also ich starte einen eigenen Prozess (meinetwegen auch Thread, wobei ich mit Threads noch nie was gemacht habe) der dann mit niedriger Priorität nebenherläuft und Bewertungen berechnet und jedes mal wenn der eine Sendung fertig hat ruft er irgendwo ein Callback auf und das aktualisiert dann für diese Sendung die Icons. Währenddessen läuft der Hauptprozess ganz normal weiter und die neuen Icons erscheinen dann quasi nachträglich.
Ja, sowas ist möglich. Es gibt zwar keine direkte Möglichkeit, eine Aktualisierung auszulösen, aber du kannst die Sendung markieren und sofort wieder entmarkieren. Dann wird die Sendung neu gemalt, dabei werden von deinem Plugin die Icons abgefragt.

Trotz allem solltest du deine Ergebnisse zwischenspeichern: 1. werden bei jedem Neumalen einer Sendung die Icons abgefragt und 2. kannst du damit bestimmt sehr viel einsparen, weil manche Sendungen sehr oft wiederholt werden (Nachrichten, Serien).

Du kannst dir ja merken, wann das Ergebnis zuletzt berechnet wurde und wann es zuletzt abgefragt wurde. So kann du asynchron alte Ergebnisse neu berechnen, bzw. rausschmeissen, wenn sie seit einem Monat (oder so) nicht mehr abgefragt wurden.

Nach oben