SWT MenuBar & MenuItems Fokus wenn F10 unterdrücken/entfernen

Christopher25

Bekanntes Mitglied
Hallo Zusammen.

Tut mir leid, wegen dieser langen und wirren Überschrift ich hoffe dies ist trozdem im ungefähren was ich möchte.
Also ich arbeite derzeit an einem Kleinen Projekt mit SWT (Standalone ohne RCP).
Habe mir die SWT und JFace Librarys zusammen gesammelt und nun ein normales Java-Projekt erstellt.
Ich habe in meinem Programm eine StyledText Komponente. Dort habe ich einen KeyListener draufgesetzt, welche bei verschiedenen F1 bis F12 Tasten eine bestimmte Aktion ausführen soll.
Das funktioniert alles Prima, nur habe ich den Nebeneffekt (warscheinlich standardmäßig von Windows!?), dass bei der F10 Taste mein erstes Element des MenuItems in den Fokus gerät, was nicht sein soll, da man nach dem F10 direkt weitertippen sollte.
Ich habe schon probiert, den Fokus nach dem F10 tastendruck direkt auf das Textfeld zu setzen, aber anscheinend immer zu früh und der Fokus ging doch an das MenuItem.
Ich weiß leider nicht, ob es ein Listener ist der dort hinter steckt, welcher Standardmäßig im MenuItem oder der MenuBar hinterlegt ist, ich weiß nämlich nicht wie man dort an die Listener dran kommt, weil diese Komponenten keine getter dafür haben soweit ich sehen konnte.
(nur eine getListener(int arg0)), was immer dieser parameter sein soll...

Kann mir jemand dabei Helfen eine Lösung zu finden?
 
Was genau möchtest du denn sehen?
Du kennst doch den Umstand ich kann die höchstens zeigen, wie ich den Listener mache,
was dir sicherlich nicht viel helfen wird.

Java:
textSQL.getComponent().addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent event) {
                // Das SQL-Statement innerhalb des Textfeldes ausführen lassen.
                // Dabei wird geschaut, ob es der ganze Text ist, oder bei einer Selektierung nur diese!
                if (event.keyCode == SWT.F1) {
                    Button buttonExecute = (Button) textSQL.getOptionMap().get("executeSQL");
                    buttonExecute.setSelection(true);
                    buttonExecute.notifyListeners(SWT.Selection, new Event());
                // Das SQL-Textfeld clearen.
                } else if (event.keyCode == SWT.F4) {
                    Button buttonClear = (Button) textSQL.getOptionMap().get("clearSQL");
                    buttonClear.setSelection(true);
                    buttonClear.notifyListeners(SWT.Selection, new Event());
                // Die Tabelle innerhalb des selektierten Tabs wird neu von der Datenbank bezogen und aktualisiert.
                } else if (event.keyCode == SWT.F5) {
                    TableViewer viewer = (TableViewer) tabFolder.getSelection().getData("tableviewer");
                    SQLTable table = (SQLTable) tabFolder.getSelection().getData("table");
                    reloadTable(viewer, table);
                // Alle Tabellen in allen Tabs werden neu von der Datenbank bezogen und aktualisiert.
                } else if (event.keyCode == SWT.F6) {
                    for (CTabItem tab : tabFolder.getItems()) {
                        TableViewer viewer = (TableViewer) tab.getData("tableviewer");
                        SQLTable table = (SQLTable) tab.getData("table");
                        reloadTable(viewer, table);
                    }
                // Einen Tab zurück schalten
                } else if (event.keyCode == SWT.F10) {
                    int itemCount = tabFolder.getItemCount();
                    int index = MainGui.this.tabIndex;
                    // Wenn der index-1 weniger ist als 0, wird auf den letzten Tab geschalten.
                    if (index-1 < 0) {
                        tabIndex = itemCount-1;
                        tabFolder.setSelection(tabIndex);
                    } else {
                        tabFolder.setSelection(--tabIndex);
                    }
              
                // Einen Tab vor schalten
                }  else if (event.keyCode == SWT.F11) {
                    int itemCount = tabFolder.getItemCount();
                    int index = MainGui.this.tabIndex;
                    // Wenn der index+1 mehr ist als itemCount, wird auf den ersten Tab geschalten.
                    if (index+1 >= itemCount) {
                        tabIndex = 0;
                        tabFolder.setSelection(tabIndex);
                    } else {
                        tabFolder.setSelection(++tabIndex);
                    }
                // Zum ersten Tab schalten
                } else if (event.keyCode == SWT.F9) {
                    tabIndex = 0;
                    tabFolder.setSelection(tabIndex);
                // Zum letzten Tab schalten
                } else if (event.keyCode == SWT.F12) {
                    int itemCount = tabFolder.getItemCount();
                    tabIndex = itemCount-1;
                    tabFolder.setSelection(tabIndex);
                }
                super.keyReleased(event);
            }
        });

Der textSQL ist eine Wrapper Klasse, welche mit getComponent das StyledText zurückliefert.
Wie gesagt, es funktioniert ja alles wie es sein soll. Die Sache ist nur, dass ich beim drücken von F10 jedes mal den Fokus auf die MenuBar bekomme.
Das ist aber in jedem Programm so. Wenn ihr das z.b. hier im Browser mal probiert, ist es das Gleiche. Aber das muss man doch irgendwie unterbinden/umgehen können oder? Und selbst wenn es nur ein unschöner Workaround ist...
 
Zuletzt bearbeitet:
Ich habe mal das gefunden, weiss aber nicht ob es hilft:

I had the same problem for many months, until I found adding the line below was able to fix it:

menu_bar.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("F10"), "none");

Where the `menu_bar` is the reference for your JMenuBar component, and "none" removes the previous action. If this ain`t enough, add 2 more lines, each the same as above, but with the conditions JComponent.WHEN_FOCUSED and JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT. This may be enough.
 
Nein leider habe ich das auch gefunden.
Ich komm ja leider nicht wirklich an die Listener dran.
Wenn ich das könnte, könnte ich schauen, was es dort bereits für Listener gibt, aber pustekuchen^^
Man bekommt nur welche, wenn man genau weiß, welchen man haben will.
 

Zurück
Oben