Ich verbinde ein JFileChooser
in meinem Programm in meinem eigenen Rahmen mit anderen benutzerdefinierten Komponenten im Rahmen. Hier ist ein Design meiner App, wie es meine Probleme visualisieren kann:
Wenn Sie nicht wissen, sind die Listen direkt unter JFrame
Titel JFileChoosers
. Die Art und Weise, wie dies funktionieren soll, ist, dass Sie Verknüpfungen zu Zielen zuweisen, und wenn Sie dann diese Tastenkombinationen drücken, bewegt sich die ausgewählte Datei zum Ziel.
Meine Strategie hierfür besteht darin, die Verknüpfung einem javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW
Bereich des InputMap
des gesamten Rahmens zuzuweisen.
Aber was nervt ist, dass etwas (ich nehme an, das JFileChooser
) reagiert immer wieder auf Tasten, die ich nicht will. Wenn ich zum Beispiel Ctrl+C
drücke, wird meine Verknüpfungsaktion nicht ausgeführt. Ich habe das mit dem nativen Look and Feel (ich benutze Windows 7) und dem Standard L & amp; F ausprobiert und beide Situationen haben das gleiche Problem. Ich denke, es könnte versuchen, eine Kopieraktion der ausgewählten Datei in JFileChooser
zu machen, denn wenn ich auf einen der Knöpfe klicke, um den Fokus zu verlieren, macht mein Ctrl+C
-Befehl plötzlich mein Aktion.
Aber ich bin mir nicht sicher, wie die JFileChooser
das macht. Wenn ich getKeyListeners()
darauf anrufe, wird ein leeres Array zurückgegeben. Ich habe auch versucht, seine Eingabekarte für diese Tastenkombination in allen drei Bereichen zu löschen, und es scheint immer noch den Tastendruck aufzunehmen.
Kann mir jemand einen Beispielcode geben, der JFileChooser
ignore Ctrl+C
enthält? Es wäre auch hilfreich, wenn mir jemand sagen könnte, wie man solche Probleme in der Zukunft beheben kann.
Hier ist ein Code von dem, was ich bisher versucht habe. Sie können dies auch verwenden, um dies selbst zu testen, da dieser Code kompiliert und ausgeführt wird, wie er ist:
%Vor%UPDATE : Ich bin so weit gegangen, rekursiv die inputMaps zu löschen und die keyListeners des JFileChooser und aller seiner untergeordneten Komponenten zu entfernen, und der JFileChooser noch schluckt meine Strg + C Befehl. Hier ist der Code, mit dem ich das gemacht habe (ich habe meinen JFileChooser hier hineingebracht):
%Vor%In der Detailansicht wird weiterhin eine ausgefüllte Eingabekarte angezeigt.
Ich vermute, dass der Unterschied zwischen der Detailansicht und der Listenansicht darin besteht, dass eine JTable die andere JList verwendet. Ich nehme an, dass Sie nur die Bindungen aus der JTable der Detailansicht entfernen müssen.
Dies kann durchgeführt werden, ohne das Detailfenster zu erstellen:
%Vor%Auch hier ist anzumerken, dass diese Lösung (zusammen mit der Lösung, die Sie derzeit haben) die standardmäßige Strg + C-Funktionalität für alle Komponenten entfernen wird, nicht nur für die Komponenten, die für den JFileChooser instanziiert wurden.
Bearbeiten:
Sollte es nicht nur von denen entfernt werden, von denen ich es entferne?
Ihr Code verwendet die Methode getParent (), um die InputMap abzurufen, die die Bindung enthält. Diese InputMap wird von allen Instanzen einer Komponente gemeinsam genutzt. Eine Komponente hat nur eindeutige Bindungen, wenn Sie Folgendes verwenden:
%Vor%Das heißt, die Bindung wird zu den Komponenten InputMap hinzugefügt, nicht zu ihren Eltern InputMap.
Woher wusstest du, dass du das tun kannst und das ist das Richtige?
Siehe UIManager-Standardeinstellungen . Dies listet die Standardwerte für den gegebenen LAF auf. Ich weiß nicht, ob das richtig ist. Soweit ich weiß, ist der Effekt der gleiche wie der Code, den Sie jetzt verwenden. Dies ist nur eine andere Möglichkeit oder das Entfernen einer Bindung aus einer InputMap, ohne dass eine tatsächliche Komponente für den Zugriff auf die InputMap der Eltern benötigt wird.
Zweiter Schnitt:
Ein einfacher Code zum Anzeigen der InputMaps ist der gleiche:
%Vor%Offenbar können InputMaps Eltern haben. Daher ist die Reinigung aller eingebauten Schlüssel- "Reaktoren" nicht vollständig. Wie Sie wahrscheinlich schon vermutet haben, registriert Swing bestimmte Tastaturbelegungen für bestimmte Komponenten. Unter Windows enthält dies oft Strg + C , da dies der OS-Standard-Hotkey zum Kopieren von Daten in die Zwischenablage ist.
Mit dieser modifizierten removeKeyboardReactors
wird die System.out.println für mich angezeigt:
Ich musste diesen Code von removeKeyboardReactors
entfernen, weil er einen Stapelüberlauf verursacht hat:
Die gesamte modifizierte Sandbox-Klasse folgt unten. Hoffentlich reicht das, um dich auf den Weg zu bringen. Wenn Sie möchten, dass das Entfernen der Schlüsselbindung mehr key-spezifisch ist, werfen Sie einen Blick auf InputMap # remove (KeyStroke) .
%Vor%Tags und Links java swing jfilechooser key-bindings key-events