In JEditorPane nur einen Teil der KeyEvents behandeln

Ich habe in einer Anwendung mit Swing-Oberfläche eine Navigation (erzeugt über Menüpunkte) erzeugt, die leider nicht funktioniert, wenn der Fokus auf einer JEditorPane liegt.

Meine Idee war jetzt, bei der JEditorPane einen JKeyListener zu hinterlegen, der je nachdem, ob meine KeyEvents von der globalen Navigation behandelt werden sollen, die KeyEvents dann an eben diese weitergibt und anderenfalls normal von der JEditorPane behandelt werden:

                @Override
                public void keyTyped(KeyEvent e) {
                    int modifier = e.getModifiers();
                    int keyCode = e.getKeyCode();
                    boolean found = false;
                    for (KeyStroke keyStroke : DROP_KEY_STROKES) {
                        int ksModifier = keyStroke.getModifiers();
                        int ksKeyCode = keyStroke.getKeyCode();
                        if (keyCode == ksKeyCode && modifier == ksModifier) {
                            found = true;
                            break;
                        }
                    }
                    if (found) {
                        // KeyEvent an die normale Navigation durchlassen, wie?
                        System.out.println("gefunden: " + keyCode + " - " + modifier);
                    }
                    else {
                        // KeyEvent von der editorPane behandeln lassen, wie?
                        System.out.println("Nicht gefunden: " + keyCode + " - " + modifier);
                        //editorPane.processKeyEvent(e); ist nicht sichtbar
                    }
                }
            });

Allerdings mangelt es mir an den Möglichkeiten der Weiterreichung. Ich habe schon eine ganze Menge dazu gegoogelt, aber vermutlich mit den falschen Stichworten. editorPane.processKeyEvent(e) ist nicht sichtbar, und ich weiß auch nicht, ob das der richtige Weg wäre.

Alles was ich eigentlich nur in der JEditorPane zulassen muss, ist Textmarkierung und Ctrl-V und Ctlr-C. Dummer Weise muss sie dafür den Fokus bekommen können, sonst kann man den Text nicht markieren. Dadurch fängt sie dann auch automatisch meine Navigationsbefehle ab.

Dafür gibt es doch bestimmt eine Lösung. Nur welche?

Ausgegeben wird immer nur Nicht gefunden: 0 - 0, egal welche nicht gefangene Taste ich gedrückt habe. Drücke ich einige der Tasten, die ich durchlassen will, geschieht das gewünschte Verhalten, bei anderen passiert gar nichts, auch keine Ausgabe. Das wirkt alles sehr wirr.

Eigentlich war das nur ein kleiner Schhönheitsfehler, den ich noch beheben wollte, der nun solche Probleme macht. Bevor ich jetzt auch noch ein kleines, ausführbares Beispiel zusammenbastel, es dann aber nur das richtige Suchstichwort war, das mir fehlte, frage ich euch erstmal so. Anderefalls reich ich das aber gern auch noch nach.

wenn ich testweise einen KeyListener adde,
dann ist das JEditorPane nicht negativ betroffen, etwa zur Eingabe von Buchstaben, aber auch die Standard-Funktionalität von Strg+C,

die Weiterleiten der Events-Frage stellt sich doch nur zusammen mit Verhinderung der internen Standard-Funktionalität,
hast du das, willst du was?

und der Standard von Strg+C reicht nicht?
vielleicht auf anderem Wege mit der Zwischenablage arbeiten, das JEditorPane dorthin schreiben lassen
und dann evtl. dort lesen, dort Listener usw., keine Ahnung was es alles gibt, Toolkit.getDefaultToolkit().getSystemClipboard()
Mit Java etwas in die Zwischenablage schreiben :: Ein Karlsruher Bloggt!

wenn es um Einfügen/ Bearbeiten des Textes geht gibt es auch noch das Document zu bedenken…


vielleicht kommst du beim JEditorPane (und überhaupt allgemein) mit Key Binding weiter:
swing - Java: Register key press on JTextPane - Stack Overflow


und noch ein allgemeiner Hinweis zu KeyListener:
in der keyTyped-Methode ist vor allem getKeyChar() aus dem Event zu verarbeiten,
getKeyCode() ist evtl. mehr was für die keyPressed-Methode
keyboard shortcuts - Java detect CTRL+X key combination on a jtree - Stack Overflow
swing - Java KeyListener Not Registering Arrow Keys - Stack Overflow

aber ich vergesse alles dazu ständig, nur Hinweis auf genaueres Ausprobieren/ Nachschlagen

Wie gesagt, die Texte sollen nicht bearbeitet werden und sich auch mit setEditable(false) versehen.

Ich will einfach, dass meine Navigation auch funktioniert, wenn zufällig das Textfeld den Fokus hat.

Dass ich immer eine 0 bekomme liegt an keyTyped. Leider bekomme ich bei keyReleased nicht keyCode und modifier, er löst einzeln aus für das loslassen von Ctrl und der Taste.

Das wirkt sehr… seltsam gelöst.

bei ‘ich will einfach’ ohne genauere Angabe zwingst du mich zur Sicherheit zu wiederholen: Key Bindings gibts auch noch

keyReleased zu benutzen ist ziemlich ungewöhnlich (wobei bei keyPressed genauso mehrere Ereignisse),
das Beispiel mit Strg+C aus dem Link zuvor funktioniert bei mir auch in keyReleased,
zumindest wenn man wie üblich das C oder V vor der Strg-Taste loslässt,
akrobatisch andersherum ist keyReleased aufgeschmissen, dann geht nur keyPressed

was DROP_KEY_STROKES ist, kann freilich auch nicht erraten werden,
ruhig auch auf dem Code mit & != 0 statt ==-Vergleich achten für Masken, wobei es bei Strg+C auch mit == gehen sollte

allerdings wie im Link mit CTRL_MASK, nicht CTRL_DOWN_MASK, da ist aufzupassen,
letzteres funktioniert gewiss bei Key Bindings, und manuell mit getModifiersEx() statt getModifiers(), wenn ich das gerade mal wieder richtig sehe

Java 1-1.3 vs. 1.4+ Unterscheidung…

Wie schon mehrfach gesagt, es geht überhaupt nicht um Ctrl-C und Ctrl-V und irgendwelche Clipboardgeschichten. Das funktioniert ja alles. Das habe ich nur erwähnt, um zu erklären, warum ich nicht einfach abstellen kann, dass die JEditorPane den Fokus bekommt. Das ist das einzige Übel. Man kann keinen Text markieren, wenn nicht der Fokus drauf liegt. Editieren soll man eh nicht, also machen all diese ganzen Tastaturkommandos (außer Ctrl-C und Ctrl-V eben) gar keinen Sinn. Keine Ahnung, warum die eine nicht editierbare JEditorPane überhaupt erst abfängt. Das ist für mich schlechtes Design.

Das einzige was ich möchte ist, wie schon gesagt, dass bestimmte Tastendrücke nicht von der sowieso nur zu Anzeige verwendeten JEditorPane verarbeitet werden.

Was könnte wohl ominöses hinter DROP_KEY_STROKES stecken, wenn es wie folgt verarbeitet wird:

    // ...
}```

?

Offensichtlich ein Container voller `KeyStrokes[\inline]. Eine Liste? Ein Array? Das ist an dieser Stelle völlig wurscht. Wie der Name eigentlich schon erahnen lässt, sind da die in den Menüs definierten Navigationsbefehle aufgelistet, eben damit ich diese an der `JEditorPane` vorbeischleusen kann. Ist das Problem so schwer zu verstehen? Ehrliche Frage.

Und du zweifelst den Vergleich mit == an? Bei `int`?

Ich vermute mal, es muss eine Möglichkeit auf höherer Ebene geben, zu bestimmen, dass etwa eine `JEditorPane` keine Anwendungs-Tastenbelegungen abfängt (und die sind durch das Menü ja hinreichend definiert.

Ich glaube ich mach doch mal ein kleines, ausführbares Beispiel daraus, ich hätte gedacht, das wäre auch so klar verständlich.

*** Edit ***


So, hier zum rumspielen
[spoiler]

```package editorPaneEatsMyKeys;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class EditorPaneEatsMyKeys {

    private final static List<KeyStroke> DROP_KEY_STROKES =
            generateDropKeyStrokes();

    private JFrame frame;

    private JTextField nameField;

    public EditorPaneEatsMyKeys() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createGUI();
                createMenu();
            }
        });
    }

    private void createGUI() {
        frame = new JFrame("Hilfe, meine JEditorPane verschlingt "
                + "meine Tastenbelegungen- argh!");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        frame.add(createCenterPart(), BorderLayout.CENTER);
        frame.add(createLowerPart(), BorderLayout.SOUTH);

        //frame.setPreferredSize(new Dimension(1400, 1100));
        frame.pack();
    }

    private Component createCenterPart() {
        JEditorPane editorPane = new JEditorPane();
        editorPane.setEditable(false);
        editorPane.setBackground(new Color(0xf0, 0xe6, 0x8c));
        editorPane.setCaretPosition(0);
        editorPane.setContentType("text/html");
        editorPane.setCaretPosition(0);
        editorPane.setFocusable(true); // Sonst nicht rauskopierbar!
        editorPane.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                int modifier = e.getModifiers();
                int keyCode = e.getKeyCode();
                boolean found = false;
                for (KeyStroke keyStroke : DROP_KEY_STROKES) {
                    int ksModifier = keyStroke.getModifiers();
                    int ksKeyCode = keyStroke.getKeyCode();
                    if (keyCode == ksKeyCode && modifier == ksModifier) {
                        found = true;
                        break;
                    }
                }
                if (found) {
                    System.out.println("gefunden: " + keyCode + " - " + modifier);
                }
                else {
                    System.out.println("Nicht gefunden: " + keyCode + " - " + modifier);
                    //editorPane.processKeyEvent(e);
                }
            }
        });
        editorPane.setText("<html><body>"
                + "<p>" + loreImpsum() + "</p>"
                + "<p>" + loreImpsum() + "</p>"
                + "<p>" + loreImpsum() + "</p>"
                + "</body></html>");

        JScrollPane scroll = new JScrollPane(editorPane);
        scroll.setPreferredSize(new Dimension(600, 200));

        return scroll;
    }

    private Component createLowerPart() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets     = new Insets(0, 1, 0, 1);
        gbc.fill       = GridBagConstraints.HORIZONTAL;
        gbc.anchor     = GridBagConstraints.WEST;
        gbc.weighty    = 0.0;

        gbc.gridy      = -1;

        {
            ++gbc.gridy;

            gbc.gridx      = 0;
            gbc.weightx    = 0.0;
            panel.add(new JLabel("Name"), gbc);

            gbc.gridx      = 1;
            gbc.weightx    = 1.0;
            nameField = new JTextField();
            nameField.setFocusable(true);
            nameField.setBackground(new Color(0xf0, 0xe6, 0x8c));
            nameField.setCaretColor(Color.RED);
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    nameField.requestFocus();
                }
            });
            panel.add(nameField, gbc);
        }

        return panel;
    }

    private void createMenu() {
        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);

        menuBar.add(createDocumentMenu());
        menuBar.add(createSomethingMenu());
        menuBar.add(createSomethingOtherMenu());
    }

    private JMenu createDocumentMenu() {
        JMenu menu = new JMenu("Document");
        menu.setMnemonic('d');

        {
            JMenuItem openMenuItem = new JMenuItem("first dokument");
            openMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_HOME, Event.CTRL_MASK | Event.SHIFT_MASK));
            openMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("first dokument");
                }
            });
            menu.add(openMenuItem);
        }
        {
            JMenuItem openMenuItem = new JMenuItem(
                    "previous document");
            openMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_PAGE_UP, Event.CTRL_MASK | Event.SHIFT_MASK));
            openMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("previous dokument");
                }
            });
            menu.add(openMenuItem);
        }
        {
            JMenuItem openMenuItem = new JMenuItem("next document");
            openMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_PAGE_DOWN, Event.CTRL_MASK | Event.SHIFT_MASK));
            openMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("next document");
                }
            });
            menu.add(openMenuItem);
        }
        {
            JMenuItem openMenuItem = new JMenuItem("last document");
            openMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_END, Event.CTRL_MASK | Event.SHIFT_MASK));
            openMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("last document");
                }
            });
            menu.add(openMenuItem);
        }

        return menu;
    }

    private JMenu createSomethingMenu() {
        JMenu menu = new JMenu("Something");
        menu.setMnemonic('s');

        {
            JMenuItem menuItem = new JMenuItem("Irgendwas");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_F1, Event.CTRL_MASK));
            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Irgendwas");
                }
            });
            menu.add(menuItem);
        }
        {
            JMenuItem menuItem = new JMenuItem("Irgendwas anderes");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_F1, Event.CTRL_MASK | Event.SHIFT_MASK));
            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Irgendwas anderes");
                }
            });
            menu.add(menuItem);
        }

        return menu;
    }

    private JMenu createSomethingOtherMenu() {
        JMenu menu = new JMenu("SomethingOther");
        menu.setMnemonic('o');

        {
            JMenuItem menuItem = new JMenuItem("mach dies");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_1, Event.CTRL_MASK));
            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("mach dies");
                }
            });
            menu.add(menuItem);
        }
        {
            JMenuItem menuItem = new JMenuItem("mach das");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_2, Event.CTRL_MASK));

            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("mach das");
                }
            });
            menu.add(menuItem);
        }
        {
            JMenuItem menuItem = new JMenuItem("mach jenes");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_3, Event.CTRL_MASK));

            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("mach jenes");
                }
            });
            menu.add(menuItem);
        }

        return menu;
    }

    private static List<KeyStroke> generateDropKeyStrokes() {
        List<KeyStroke> list = new ArrayList<>();

        int ctrl = Event.CTRL_MASK;
        int shiftCtrl = Event.CTRL_MASK | Event.SHIFT_MASK;

        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_F1, ctrl));
        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_F1, shiftCtrl));

        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_1, ctrl));
        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_2, ctrl));
        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_3, ctrl));

        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_HOME, shiftCtrl));
        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, shiftCtrl));
        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, shiftCtrl));
        list.add(KeyStroke.getKeyStroke(KeyEvent.VK_END, shiftCtrl));

        return list;
    }

    private static String loreImpsum() {
        return "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed "
                + "diam nonumy eirmod tempor invidunt ut labore et dolore "
                + "magna aliquyam erat, sed diam voluptua. At vero eos et "
                + "accusam et justo duo dolores et ea rebum. Stet clita kasd "
                + "gubergren, no sea takimata sanctus est Lorem ipsum dolor "
                + "sit amet. Lorem ipsum dolor sit amet, consetetur "
                + "sadipscing elitr, sed diam nonumy eirmod tempor invidunt "
                + "ut labore et dolore magna aliquyam erat, sed diam voluptua. "
                + "At vero eos et accusam et justo duo dolores et ea rebum. "
                + "Stet clita kasd gubergren, no sea takimata sanctus est "
                + "Lorem ipsum dolor sit amet.";
    }

    public void setVisual(final boolean visual) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setVisible(visual);
            }
        });
    }

    public static void main(String[] args) {
        EditorPaneEatsMyKeys demo = new EditorPaneEatsMyKeys();
        demo.setVisual(true);
    }

}
```[/spoiler]


Man beachte den Unterschied mit dem Focus im Namensfeld und dem Focus im Editor. Befehle wie Ctrl-1 gehen durch, Ctrl-F1 aber nicht, und auch viele andere nicht.

du hast von KeyListener auf JEditorPane gesprochen + dem Satz „Alles was ich eigentlich nur in der JEditorPane zulassen muss, ist Textmarkierung und Ctrl-V und Ctlr-C.“,
dazu DROP_KEY_STROKES, worunter man z.B die Strg+V-Strokes verstehen könnte
( SELFHTML Forumsarchiv / 2000 / September / strg-c + strg-v (also Drag+Drop) mit Javascript? :wink: )

„Wie gesagt, die Texte sollen nicht bearbeitet werden und sich auch mit setEditable(false) versehen.“
in der ersten Antwort passt gut auf Ausklammerung der von mir erwähnten einzelnen Buchstaben, während zumindest Strg-C noch im Rennen wäre

da liegt es nicht fern, an diese Kommandos zu denken, warum meckerst du statt einzusehen dass du es bisher nicht deutlich geschrieben hast?

jetzt sehe ich, dass du mit „Alles was ich eigentlich nur in der JEditorPane zulassen muss, ist Textmarkierung und Ctrl-V und Ctlr-C.“
meintest, (nur) diese Kommandos ans JEditorPane weiterzuleiten?


interessant ist dazu, dass du am Anfang noch einen Weg speziell zur Weiterleitung gesucht hast: „Allerdings mangelt es mir an den Möglichkeiten der Weiterreichung.“

ich habe extra dazu nachgefragt:

[quote=SlaterB;111562]die Weiterleiten der Events-Frage stellt sich doch nur zusammen mit Verhinderung der internen Standard-Funktionalität,
hast du das, willst du was?[/quote]
aber darauf bist du nicht eingegangen,

nun geht es also um die Verhinderung der internen Standard-Funktionalität, gut zu wissen


gibts auch bei int manchmal anzuzweifeln

Stichwort Bitmaske, Bitfeld – Wikipedia
für das (alte) e.getModifier() ist etwa die Strg-Maske 2 = Bits 10, Shift ist 1 = Bits 1

wenn nun Strg+Shift+Buchstabe gedrückt werden, dann ist der Modifier 11, beinhaltet beide Masken,
mit modifer & maske != 0 kann man die einzelnen Masken sicher abfragen

edit: wie ich sehe, hast du shiftCtrl = Event.CTRL_MASK | Event.SHIFT_MASK;,
dann sollte es dir doch bekannt sein :wink:

theoretisch könnte es damit dann mit == klappen, wenn nur diese Tasten gedrückt sind,
wie gerade getestet ist KeyStroke aber etwas gemein, fügt in die Maske sowohl CTRL_MASK = 2 als auch CTRL_DOWN_MASK = 128 ein zu 130 und ähnlichem kombiniert,

also gilt dann doch: mit (modifier & ksModifier) != 0 würde dein KeyListener ‚gefunden‘ ausgeben, mit == gehts nicht,

ob vom KeyEvent getModifier() oder getModifierEx() aufgerufen wird, und ob an KeyStroke CTRL_MASK oder CTRL_DOWN_MASK übergeben wird, ist dabei egal,
weil eben beides zusammengemischt wird


falls du noch Mecker vertragen kannst,
dann wäre ein etwas gekürztes Test-Programmm zu bevorzugen, ein statt vier Menüs tun es doch auch :wink:

editorPane.setFocusable(true); // Sonst nicht rauskopierbar!
bei mir schon, Markierung, Strg+C, Tab-Wechsel für Focus, alles geht, ob mit oder ohne Befehl, hmm…,
spätes edit: ok, einfache Standardlösung: true ist schon der Standardwert, bereits gesetzt

wie definiert sich ‚geht durch‘?

ich kann zwischen Ctrl-1 und Ctrl-F1 keinen Unterschied in der Funktionalität feststellen,
im Textfeld kommt ‚mach dies‘ + ‚Irgendwas‘
im JEditorPane kommen die Meldungen auch + der eigene KeyListener, ob ‚nicht gefunden‘ oder ‚gefunden‘ je nach Modifer-Vergleich,

bei Ctrl-Shift-F1 kommt sogar als drittes noch die mir neue Swing-Funktionalität eines Debugs der aktuellen Komponente
How to debug Java Swing Layouts - Stack Overflow

ob das JEditorPane dabei auch was macht ist doch gar nicht feststellbar, hat bestimmt nichts auf Ctrl-1 belegt


dein Problem ist zusammengefasst, dass bei Ctrl-1 (edit: Ctrl-F1) bei Focus auf JEditorPane keine Ausgabe ‚mach dies‘ (edit: ‚Irgendwas‘) kommt?
kann ich persönlich noch nicht im Programm nachbilden,
aber jetzt habe ich dieses Posting eh schon über 1 Stunde nebenher in Etappen geschrieben, nun muss ich eh erstmal Schlussstrich ziehen :wink:

(edit: und bin wahrscheinlich bis Sonntag gleich nicht mehr da, was aber vielleicht auch ganz gut sein kann :wink:
ob man was dabei tun kann weiß ich eh nicht unbedingt )

Ich glaube schon das Dein Problem im wesentlichen verstanden wurde. Und die Lösung wurde eigentlich auch schon genannt: Nutze KeyBindings

Und zwar nicht, um die an Dein Menü zu hängen sondern, um die gewünschten von Deiner EditorPane zu entfernen. Außerdem hattest Du uns bisher die JScrollPane verschwiegen :wink: Die reagiert ebenfalls auf HOME und END usw. daher nutzt Dein Vorhaben diese per KeyListener in der EditorPane abzufangen nicht viel.

Eine Möglichkeit ist: Du entfernst bei EditorPane (und ScrollPane) die komplette InputMap und bis auf die Befehle die Du tatsächlich benötigst. Bin mir grad nicht sicher ob das so einfach geht.
Oder Du überschreibst die beiden InputMaps für die entsprechenden KeyStrokes mit ungültigen ActionMapKeys.
Aufsetzend auf Deinem Code:

	
	...
			
	for (KeyStroke keyStroke: generateDropKeyStrokes()) {
		editorPane.getInputMap(JComponent.WHEN_FOCUSED).put(keyStroke, "none");
		scroll.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(keyStroke, "none");
	}
	
	return scroll;
}```

hier vielleicht ein passender Artikel dazu, Code wie von _Michael :
Overriding the Standard JTextPane Methods | Java Articles

geradezu verdächtig gleich mit “none”, hat das eine Bedeutung oder geht jede (vermeintlich) nicht definierte Action?

Danke für eure ganzen Antworten, damit werde ich mich nun mal auseinandersetzen, wenn Zeit ist für dieses Teilprojekt.

[quote=SlaterB]falls du noch Mecker vertragen kannst,
dann wäre ein etwas gekürztes Test-Programmm zu bevorzugen, ein statt vier Menüs tun es doch auch[/quote]
Ich hatte das alles erst zusammen in einem Menü, ich dachte es wäre einfacher nachzuvollziehen, wenn ich es aufteile, weil dann klar ersichtlich ist, welche unterschiedlichen Tastendrücke da zusammenlaufen. Im Originalprojekt sind es wesentlich mehr.

Außerdem weisen diese ein unterschiedliches Verhalten auf:

Deshalb hatte ich es nicht einfach auf ein Beispielkommando reduziert.

[quote=SlaterB;111620]wie definiert sich ‚geht durch‘?

ich kann zwischen Ctrl-1 und Ctrl-F1 keinen Unterschied in der Funktionalität feststellen,
im Textfeld kommt ‚mach dies‘ + ‚Irgendwas‘
im JEditorPane kommen die Meldungen auch + der eigene KeyListener, ob ‚nicht gefunden‘ oder ‚gefunden‘ je nach Modifer-Vergleich,[/quote]

Das ist ja ein dicker Hund. Ist bei mir nun auch so, dass beides durchgeht, nachdem der Rechner am Wochenende aus war. kopf kratz
Als ich das Testprogramm zusammenbaute, war das Verhalten noch unterschiedlich. Bei Ctrl-1 kam die Ausgabe („mache dies“), bei Ctrl-F1 kam sie nicht (jetzt „Irgendwas“).

Der zuletzt verlinkte Artikel scheint ja exakt dieses Problem zu behandeln, super! Entschuldige bitte meinen zwischenzeitlich etwas genervten Ton. Es war gegen Ende der Woche und es ist einfach lästig, wenn ein eigentlich fertiges Produkt an Dingen scheitert, die man eigentlich von der Oberfläche als Default erwarten könnte (darüber könnte man vermutlich streiten, wäre aber das, was ich für sinnvoll hielte).

nicht zu vermeidende Anmerkung:

[quote=Crian]Ich hatte das alles erst zusammen in einem Menü, ich dachte es wäre einfacher nachzuvollziehen, wenn ich es aufteile, weil dann klar ersichtlich ist, welche unterschiedlichen Tastendrücke da zusammenlaufen. Im Originalprojekt sind es wesentlich mehr.
[/quote]
natürlich auch nur wenige Aktionen, nicht genauso viele in ein Menü, da wäre ja an Zeilen nicht viel gespart

Außerdem weisen diese ein unterschiedliches Verhalten auf:

also genau zwei Aktionen drin lassen :wink:

Wegen des unterschiedlichen Verhaltens wollte ich alle Varianten drin lassen.

Hat jemand eine Ahnung, woher die seltsame Ausgabe bei Ctrl-Shift-F1 kommt? Scheint irgendwie eine Beschreibung der Gui zu sein.

*** Edit ***

Hier die funktionierende Lösung (nach dem genannten Artikel Overriding the Standard JTextPane Methods | Java Articles):

[spoiler]

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.InputMap;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

public class EditorPaneEatsMyKeysMinimalSolution {

    private final static List<OverrideKey> DROP_KEY_STROKES =
            generateDropKeyStrokes();

    private JFrame frame;

    private JTextField nameField;

    public EditorPaneEatsMyKeysMinimalSolution() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createGUI();
                createMenu();
            }
        });
    }

    private void createGUI() {
        frame = new JFrame("Hilfe, meine JEditorPane verschlingt "
                + "meine Tastenbelegungen- argh!");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        frame.add(createCenterPart(), BorderLayout.CENTER);
        frame.add(createNameFieldPart(), BorderLayout.SOUTH);

        frame.pack();
    }

    private Component createCenterPart() {
        JEditorPane editorPane = new JEditorPane();
        editorPane.setEditable(false);
        editorPane.setBackground(new Color(0xf0, 0xe6, 0x8c));
        editorPane.setCaretPosition(0);
        editorPane.setContentType("text/html");
        editorPane.setCaretPosition(0);
        editorPane.setText("<html><body>"
                + "<p>" + loreImpsum() + "</p>"
                + "<p>" + loreImpsum() + "</p>"
                + "<p>" + loreImpsum() + "</p>"
                + "</body></html>");

        JScrollPane scroll = new JScrollPane(editorPane);
        scroll.setPreferredSize(new Dimension(600, 200));

        disableKeys(
                editorPane.getInputMap(),
                scroll.getInputMap(
                        JScrollPane.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT));

        return scroll;
    }

    private void disableKeys(InputMap... inputMaps) {
        for (OverrideKey key : DROP_KEY_STROKES) {
            KeyStroke keyStroke = KeyStroke.getKeyStroke(key.getKeyCode(),
                    key.getModifier());
            for (InputMap inputMap : inputMaps) {
                inputMap.put(keyStroke, "none");
            }
        }
    }

    private Component createNameFieldPart() {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets     = new Insets(0, 1, 0, 1);
        gbc.fill       = GridBagConstraints.HORIZONTAL;
        gbc.anchor     = GridBagConstraints.WEST;
        gbc.weighty    = 0.0;

        gbc.gridy      = -1;

        {
            ++gbc.gridy;

            gbc.gridx      = 0;
            gbc.weightx    = 0.0;
            panel.add(new JLabel("Name"), gbc);

            gbc.gridx      = 1;
            gbc.weightx    = 1.0;
            nameField = new JTextField();
            nameField.setFocusable(true);
            nameField.setBackground(new Color(0xf0, 0xe6, 0x8c));
            nameField.setCaretColor(Color.RED);
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    nameField.requestFocus();
                }
            });
            panel.add(nameField, gbc);
        }

        return panel;
    }

    private void createMenu() {
        JMenuBar menuBar = new JMenuBar();
        frame.setJMenuBar(menuBar);

        menuBar.add(createAMenu());
    }

    private JMenu createAMenu() {
        JMenu menu = new JMenu("Menü");
        menu.setMnemonic('m');

        {
            JMenuItem openMenuItem = new JMenuItem("first dokument");
            openMenuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_HOME, Event.CTRL_MASK | Event.SHIFT_MASK));
            openMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("first dokument");
                }
            });
            menu.add(openMenuItem);
        }
        {
            JMenuItem menuItem = new JMenuItem("Irgendwas");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_F1, Event.CTRL_MASK));
            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Irgendwas");
                }
            });
            menu.add(menuItem);
        }
        {
            JMenuItem menuItem = new JMenuItem("Irgendwas anderes");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_F1, Event.CTRL_MASK | Event.SHIFT_MASK));
            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Irgendwas anderes");
                }
            });
            menu.add(menuItem);
        }
        {
            JMenuItem menuItem = new JMenuItem("mach dies");
            menuItem.setAccelerator(KeyStroke.getKeyStroke(
                    KeyEvent.VK_1, Event.CTRL_MASK));
            menuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("mach dies");
                }
            });
            menu.add(menuItem);
        }

        return menu;
    }

    private static List<OverrideKey> generateDropKeyStrokes() {
        List<OverrideKey> list = new ArrayList<>();

        int ctrl = Event.CTRL_MASK;
        int shiftCtrl = Event.CTRL_MASK | Event.SHIFT_MASK;

        list.add(new OverrideKey(KeyEvent.VK_HOME, shiftCtrl));

        list.add(new OverrideKey(KeyEvent.VK_F1, ctrl));
        list.add(new OverrideKey(KeyEvent.VK_F1, shiftCtrl));

        list.add(new OverrideKey(KeyEvent.VK_1, ctrl));


        return list;
    }

    private static String loreImpsum() {
        return "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed "
                + "diam nonumy eirmod tempor invidunt ut labore et dolore "
                + "magna aliquyam erat, sed diam voluptua. At vero eos et "
                + "accusam et justo duo dolores et ea rebum. Stet clita kasd "
                + "gubergren, no sea takimata sanctus est Lorem ipsum dolor "
                + "sit amet. Lorem ipsum dolor sit amet, consetetur "
                + "sadipscing elitr, sed diam nonumy eirmod tempor invidunt "
                + "ut labore et dolore magna aliquyam erat, sed diam voluptua. "
                + "At vero eos et accusam et justo duo dolores et ea rebum. "
                + "Stet clita kasd gubergren, no sea takimata sanctus est "
                + "Lorem ipsum dolor sit amet.";
    }

    public void setVisual(final boolean visual) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setVisible(visual);
            }
        });
    }

    public static void main(String[] args) {
        EditorPaneEatsMyKeysMinimalSolution demo =
                new EditorPaneEatsMyKeysMinimalSolution();
        demo.setVisual(true);
    }

}

    private final int keyCode;
    private final int modifier;

    OverrideKey(final int keyCode, final int modifier) {
        this.keyCode = keyCode;
        this.modifier = modifier;
    }

    int getKeyCode() {
        return keyCode;
    }

    int getModifier() {
        return modifier;
    }

}

[/spoiler]

keine 100%-Erklärung, aber im Link schon einige Folge-Links

ah, Quellcode auch zu finden :wink:

Window-Klasse

     * Implements a debugging hook -- checks to see if
     * the user has typed <i>control-shift-F1</i>.  If so,
     * the list of child windows is dumped to <code>System.out</code>.
     * @param e  the keyboard event
     */
    void preProcessKeyEvent(KeyEvent e) {
        // Dump the list of child windows to System.out.
        if (e.isActionKey() && e.getKeyCode() == KeyEvent.VK_F1 &&
            e.isControlDown() && e.isShiftDown() && 
            e.getID() == KeyEvent.KEY_PRESSED) {
            list(System.out, 0);
        }
    }

StackTrace

	at java.awt.Window.preProcessKeyEvent(Window.java:1304)
	at java.awt.Component.dispatchEventImpl(Component.java:3954)
	at java.awt.Container.dispatchEventImpl(Container.java:2024)
	at java.awt.Window.dispatchEventImpl(Window.java:1791)
	at java.awt.Component.dispatchEvent(Component.java:3819)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1828)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:681)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:940)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:810)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:645)
	at java.awt.Component.dispatchEventImpl(Component.java:3857)
	at java.awt.Container.dispatchEventImpl(Container.java:2024)
	at java.awt.Window.dispatchEventImpl(Window.java:1791)
	at java.awt.Component.dispatchEvent(Component.java:3819)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Danke.

Zumindest dafür waren die vielen Menüs dann ja noch gut :wink:

Sonst wäre Ctrl-Shift-F1 sicher rausgeflogen!