Ich bin ein JFileChooser
in meinem Programm in meinem eigenen Rahmen mit anderen benutzerdefinierten Komponenten in den Rahmen eingebettet. Ist hier ein Entwurf von meiner app, wie es helfen kann, meine Probleme zu visualisieren:Wie entfernen Sie die Aktion Strg + C auf einem JFileChooser?
Wenn Sie nicht sagen können, die Listen direkt unter den JFrame
Titel sind 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 dafür ist, die Verknüpfung zu einem javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW
Bereich der InputMap
des gesamten Rahmens zuweisen.
Aber was ist ärgerlich ist, dass etwas (ich gehe davon aus, dass JFileChooser
) reagiert/absorbieren Tasten drücken Ich will es nicht. Wenn ich beispielsweise Ctrl+C
drücke, wird meine Verknüpfungsaktion nicht ausgeführt. Ich habe dies mit dem nativen Look and Feel (ich benutze Windows 7) und der Standard L & F und beide Situationen haben das gleiche Problem. Ich denke, es könnte versuchen, eine Kopieraktion der ausgewählten Datei in der JFileChooser
zu tun, weil, wenn ich auf eine der Schaltflächen klicken, um es den Fokus zu verlieren, plötzlich mein Ctrl+C
Befehl meine Aktion.
Aber ich bin nicht wirklich sicher, wie die JFileChooser
dies tut. 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 zu absorbieren.
Kann mir jemand einen Beispielcode geben, der die JFileChooser
ignoriert Ctrl+C
? 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 zu testen, diese auf eigene Faust, um zu versuchen, da dieser Code und läuft kompiliert, wie sie ist:
package com.sandbox;
import javax.swing.*;
import java.awt.event.ActionEvent;
public class Sandbox {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control C"), "println");
panel.getActionMap().put("println", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
System.out.println("The JPanel action was performed!");
}
});
panel.add(buildFileChooser()); //if you comment out this line, Ctrl+C does a println, otherwise my action is ignored.
frame.setContentPane(panel);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private static JFileChooser buildFileChooser() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.getActionMap().clear(); //I've tried lots of ideas like this, but the JFileChooser still responds to Ctrl+C
return fileChooser;
}
}
UPDATE: Ich habe so weit gegangen, wie rekursiv die löschen inputMaps und entfernen Sie die keyListeners der JFileChooser und alle seine untergeordneten Komponenten und der JFileChooser immer noch schluckt meine Strg + C-Befehl. Hier ist der Code, den ich verwendet habe, dies zu tun (gab ich meine JFileChooser in this):
private static void removeKeyboardReactors(JComponent root) {
System.out.println("I'm going to clear the inputMap of: " + root);
root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).clear();
root.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).clear();
root.getInputMap(JComponent.WHEN_FOCUSED).clear();
root.getActionMap().clear();
if (root.getRootPane() != null) {
removeKeyboardReactors(root.getRootPane());
}
for (KeyListener keyListener : root.getKeyListeners()) {
root.removeKeyListener(keyListener);
}
for (Component component : root.getComponents()) {
if (component instanceof JComponent) {
removeKeyboardReactors((JComponent) component);
} else if (component instanceof Container) {
Container container = (Container) component;
for (Component containerComponent : container.getComponents()) {
if (containerComponent instanceof JComponent) {
removeKeyboardReactors((JComponent) containerComponent);
} else {
System.out.println("This Container Component was not a JComponent: " + containerComponent);
}
}
} else {
System.out.println("This was not a JComponent: " + component);
}
}
}
nicht sicher, warum Sie mich fragen, hier zu helfen. Du hast eine Antwort. Ctrl C funktioniert nicht immer, da Komponenten wie JTextField und JList diese Key Bindings zuordnen. Sie haben diese Bindung aus allen Komponenten in der Dateiauswahl entfernt, damit der Code jetzt funktioniert. Natürlich ist das Problem mit dieser Lösung, dass die Strg + C-Funktionalität von allen Komponenten in Ihrer Anwendung entfernt wird, nicht nur die Komponenten in der Dateiauswahl. Ich kenne keine andere Lösung. – camickr
@camickr Um genau zu sein, habe ich dich mit einem Kommentar verbunden, den ich über die Antwort, die ich bekommen habe, gemacht habe. "Ich habe ein Problem damit gefunden.Wenn Sie es in die Detailansicht umschalten, klicken Sie auf eine Datei, die immer noch "Control C" verschluckt. Aber wenn du auf das Textfeld klickst, ist das nicht gut, weil es früher so war. Irgendeine Idee, was das verursacht? " –