JFileChooser
フレーム内の他のカスタムコンポーネントを使用して、自分のフレーム内のプログラムに を埋め込んでいます。問題を視覚化するのに役立つかもしれない私のアプリのデザインは次のとおりです。
わからない場合は、JFrame
タイトルのすぐ下のリストがJFileChoosers
. これが機能するはずの方法は、ショートカットを宛先に割り当て、それらのショートカットキーを押すと、選択したファイルが宛先に移動することです。
これを行うための私の戦略は、ショートカットをフレーム全体の javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW
スコープに割り当てることです。InputMap
しかし、厄介なのは、何か (私は と仮定しますJFileChooser
) が、私が望んでいないキーの押下に応答/吸収し続けることです。たとえばCtrl+C
、ショートカット アクションを押しても実行されません。ネイティブのルック アンド フィール (Windows 7 を使用) とデフォルトの L&F でこれを試しましたが、どちらの状況でも同じ問題が発生します。JFileChooser
ボタンの 1 つをクリックして強制的にフォーカスを失うと、突然Ctrl+C
コマンドがアクションを実行するため、選択したファイルのコピー アクションを実行しようとしている可能性があると思います。
しかし、私はこれをどのようにJFileChooser
行っているのかよくわかりません。それを呼び出すgetKeyListeners()
と、空の配列が返されます。また、3 つのスコープすべてでこのキーの組み合わせの入力マップをクリアしようとしましたが、まだキープレスを吸収しているようです。
JFileChooser
誰かが無視するサンプルコードを教えてもらえますCtrl+C
か? また、今後このような問題をデバッグする方法を教えていただけると助かります。
ここに私がこれまでに試したことのいくつかのコードがあります。このコードはそのままコンパイルおよび実行されるため、これを使用して自分でこれをテストすることもできます。
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 : inputMaps を再帰的にクリアし、JFileChooser とそのすべての子コンポーネントの keyListeners を削除しましたが、JFileChooser はまだCtrl+C コマンドを飲み込んでいます。これを行うために使用したコードは次のとおりです(JFileChooserをこれに渡しました):
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);
}
}
}