OpenOffice - the never ending Story.

Status
Nicht offen für weitere Antworten.

JSteinhilber

Bekanntes Mitglied
Hallo zusammen,
für mein Problem KeyEvents von OOo in eine eigene Java-Anwendung umzuleiten habe ich von einem offensichtlichen Fachmann einen prima Tip bekommen:

Code:
        XWindowPeer myWindowPeer = (XWindowPeer) 
        UnoRuntime.queryInterface (XWindowPeer.class,doc.getFrame().getXFrame().getContainerWindow()); 
        XToolkit myToolkit = myWindowPeer.getToolkit(); 
        XExtendedToolkit myExtToolkit = (XExtendedToolkit) 
        UnoRuntime.queryInterface (XExtendedToolkit.class, myToolkit); 
        myExtToolkit.addKeyHandler(new XKeyHandler() {
        public boolean keyPressed(KeyEvent k) {
          if(k.Modifiers == KeyModifier.MOD1 && k.KeyCode == Key.LEFT) {
              System.out.println("Strg+PFEIL-LINKS");
              Reha.thisClass.setDivider(1);
          }else if(k.Modifiers == KeyModifier.MOD1 && k.KeyCode == Key.RIGHT){
              System.out.println("Strg+PFEIL-RECHTS");
              Reha.thisClass.setDivider(2);
          }else if(k.Modifiers == KeyModifier.MOD1 && k.KeyCode == Key.UP){
              System.out.println("Strg+PFEIL-AUF");
              Reha.thisClass.setDivider(3);
          }else if(k.Modifiers == KeyModifier.MOD1 && k.KeyCode == Key.DOWN){
              System.out.println("Strg+PFEIL-AB");
              Reha.thisClass.setDivider(4);
          }else if(k.Modifiers == KeyModifier.MOD1 && k.KeyCode == Key.F7) {
            System.out.println("Strg+F7");
            Reha.jPContainerUnten.requestFocus();
          }
          return false;
          }
          public boolean keyReleased(KeyEvent arg0) {return false;}
          public void disposing(EventObject arg0) {}
       });

Die KeyEvents kommen erstklassig an, das ist schon mal eine super Sache. Wenn ich jedoch nach eintreffen des KeyEvent "Strg+F7" versuche den Focus auf einen anderen Container meines Desktops zu legen, hängt OOo nebst der Java-Anwendung mitsamt der JVM.

Ich vermute(!!) man muß OOo den Verlust des Focus mitteilen bevor dieser programmatisch vollzogen wird. Aber mit dem "vermuten" ist das halt so eine Sache.

Hat jemand eine Idee oder gar Ahnung davon, ob meine "Vermutung" zutrifft und wenn ja, wie das Problem gelöst werden könnte?

Die DevelopersGuide.pdf des OOo-SDK's habe ich bereits durchsucht (so gut es ging), aber - no success - wie der Schwabe zu sagen pflegt.....

Herzliche Grüße an alle
Jürgen
 

Wildcard

Top Contributor
Starte im Debug Modus, und lass ihn sich aufhängen. Hast du Eclipse?
Wenn ja, dann pausierst du sobald er hängt den AWT EventDispatchThread und schaust mal wo er hängt.
Focus handling mit mehreren UI Threads kann leider sehr schnell zu Deadlocks führen.
 

JSteinhilber

Bekanntes Mitglied
Wildcard hat gesagt.:
Starte im Debug Modus, und lass ihn sich aufhängen. Hast du Eclipse?
Wenn ja, dann pausierst du sobald er hängt den AWT EventDispatchThread und schaust mal wo er hängt.
Focus handling mit mehreren UI Threads kann leider sehr schnell zu Deadlocks führen.

Ok mach ich.....
Bahnhof und abfahren habe ich verstanden und die Frage ob ich Eclipse habe konnte ich mental ebenfalls verarbeiten, aber damit hat dann die Verarbeitungsfähigkeit bereits ihr jähes Ende erreicht.

Ja ich habe Eclipse und seit diesem Thread obendrein noch 3-7 Millionen Fragezeichen mehr in den Augen als ich sie ohnehin schon hatte.....

Grüße an Dich, lieber Wildcard

Jürgen
 

Wildcard

Top Contributor
In der Debug Perspective bekommst du eine Liste aller laufenden Threads. sobald die Sache hängt, klickst du einen davon an und drückst auf Pause. Dann wird der Stacktrace angezeigt und du kannst sehen wo der Deadlock sitzt.
 

JSteinhilber

Bekanntes Mitglied
Ok also der StackTrace lautet

Code:
Thread [Thread-19] (Suspended)	
	WComponentPeer._requestFocus(Component, boolean, boolean, long, CausedFocusEvent$Cause) line: not available [native method]	
	WFramePeer(WComponentPeer).requestFocus(Component, boolean, boolean, long, CausedFocusEvent$Cause) line: not available	
	RehaTP(Component).requestFocusHelper(boolean, boolean, CausedFocusEvent$Cause) line: not available	
	RehaTP(Component).requestFocusHelper(boolean, boolean) line: not available	
	RehaTP(Component).requestFocus() line: not available	
	RehaTP(JComponent).requestFocus() line: not available	
	OoStart$1.keyPressed(KeyEvent) line: 112	
	NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]	
	NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available	
	DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available	
	Method.invoke(Object, Object...) line: not available	
	Job.dispatch_MethodCall(Object[]) line: 98	
	Job.execute() line: 152	
	JobQueue.enter(int, Object) line: 377	
	JobQueue$JobDispatcher.invoke(Object[]) line: 117	
	JobQueue$JobDispatcher.run() line: 145

Das ganze Spektakel sieht bildlich dan so aus:

debug.jpg



Gruß
Jürgen[/img]
 

JSteinhilber

Bekanntes Mitglied
Hier der StackTrace der AWT Event Queue:
Code:
Thread [AWT-EventQueue-0] (Suspended)	
	Object.wait(long) line: not available [native method]	
	EventQueue(Object).wait() line: 485	
	EventQueue.getNextEvent() line: not available	
	EventDispatchThread.pumpOneEventForFilters(int) line: not available	
	EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter) line: not available	
	EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component) line: not available	
	EventDispatchThread.pumpEvents(int, Conditional) line: not available	
	EventDispatchThread.pumpEvents(Conditional) line: not available	
	EventDispatchThread.run() line: not available

Das ganze 'Benutzerinterface sollte dann eigentlich so aussehen:
ui.jpg

Sinn und Zweck der Übung soll eigentlich sein über Kurzwegtasten schnell zwischen Textverarbeitung und Terminkalender oder Textverarbeitung und Patientenstamm etc. hin- und herspringen zu können.

Grüße
Jürgen
 

Wildcard

Top Contributor
Versuch mal so:
Code:
SwingUtillities.invokeLater(new Runnable(){
   public static void run()
   {
      Reha.jPContainerUnten.requestFocusInWindow(); 
   }
});
 

JSteinhilber

Bekanntes Mitglied
Hallo Wildcard,
zunächst mußte ich aufgrund der verbindlichen Anweisung von Eclipse "static" entfernen und jetzt bekomme ich noch 2-tausend Fehlermeldungen die wohl auf meine unzulängliche Programmierung im Zusammenhang mit den JXTitledPanels und deren ContentContainer zuzurückzuführen sind.

Ich gehe der Sache nach und halte Dich auf dem Laufenden, oder besser gesagt - gehe Dir dann wieder auf die Nerven.

Grüße und erneut vielen Dank für Deine Hilfe.
(Der Name Wildcard wird wohl irgendwann in einem Splash-Screen besondere Erwähnung finden müssen)

Jürgen
 

Wildcard

Top Contributor
ups... frag mich bitte nicht warum ich das static dazu geschrieben habe. Das ist totaler Käse :autsch:
Ich schätze ohne IDE geht bei mir nichts mehr...
 

JSteinhilber

Bekanntes Mitglied
O.k. - Unzulänglichkeit behoben.
Du bist der Hammer, es funktioniert!

Grüße
Jürgen

(dem es völlig schleierhaft ist wie man auf diese Lösung kommen kann)
 

Wildcard

Top Contributor
Schön das es geht.
Das Problem ist einfach, das UI Toolkits grundsätzlich nicht threadsicher sind.
Der Listener wird wohl aus dem dem UNO Thread aufgerufen. Wenn du nun Swing Komponenten manipulieren willst, musst du mit dem AWT Event Dispatch Thread synchronisieren in dem die Swing GUI läuft. Das geschieht über die SwingUtilities
 

Reality

Top Contributor
Wildcard hat gesagt.:
Schön das es geht.
Das Problem ist einfach, das UI Toolkits grundsätzlich nicht threadsicher sind.

Auch interessant:

Bei Swing ist der gleiche Thread dafür zuständig, die Oberfläche neu zu zeichnen und die Events abzuarbeiten.
Dies wird besonders deutlich, wenn bei einem kurzen Drücken eines Buttons etwas Rechenintensives geschieht. Da der Thread, der dieses Ereignis auslöst der gleiche ist, der für das Zeichnen des Buttons verantwortlich ist, bleibt der Button gedrückt gezeichnet, solange die actionPerformed(ActionEvent e)-Methode des ActionListener nicht verlassen wird. Erst danach wird der Button wieder so gezeichnet, wie man es erwartet, wenn die Maustaste losgelassen wurde.

http://www.dpunkt.de/java/Programmieren_mit_Java/Oberflaechenprogrammierung/67.html

Liebe Grüße
Reality
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
M Metadata von OpenOffice editieren. Allgemeine Java-Themen 1
J OpenOffice Makro aufrufen Allgemeine Java-Themen 2
F String in OpenOffice Ods datei abspeichern? Allgemeine Java-Themen 8
S Embedded OpenOffice Crashs Allgemeine Java-Themen 1
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
MrGe Java-Applikation und OpenOffice/UNO Allgemeine Java-Themen 2
C OpenOffice Writer und Zeilenumbruch Allgemeine Java-Themen 4
F OpenOffice Writer in Java einbinden Allgemeine Java-Themen 8
D OpenOffice Calculator Dateien mit Java bearbeiten Allgemeine Java-Themen 3
S Problem mit CSV-Import in OpenOffice Allgemeine Java-Themen 8
C Java Application und OpenOffice Allgemeine Java-Themen 5
A Ausgabe in OpenOffice Calc oder pdf Allgemeine Java-Themen 3
C rhino und OpenOffice SDK Allgemeine Java-Themen 6
J Nicht schießen - schon wieder OpenOffice. Allgemeine Java-Themen 4
J Immer noch OpenOffice.org - Malheur Allgemeine Java-Themen 4
J OpenOffice.org Events in eigene Anwendung umleiten Allgemeine Java-Themen 4
N Openoffice unter Java beenden Allgemeine Java-Themen 18
H OpenOffice Allgemeine Java-Themen 10
C OpenOffice API - Java Steuerung Allgemeine Java-Themen 21
A never used locally Allgemeine Java-Themen 8

Ähnliche Java Themen


Oben