私は を持ってJFileChooser
いJFrame
ます。に を追加しActionListener
て、JFileChooser
クリックしたときに [キャンセル] ボタンが機能するようにしました。「キャンセル」ボタンにタブで移動することもできますが、「Enter」キーを押しても何も起こりません (つまり、ActionListener
イベント コマンドで が呼び出されませんJFileChooser.CANCEL_SELECTION
)。JFileChooser
「キャンセル」ボタンで「Enter」キーを押すことが「キャンセル」ボタンをクリックするのと同じになるようにするには、どうすればよいですか?
私が見ている(誤った)動作の簡単な例を次に示します。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public final class TestApp {
public static void main(final String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
final JFileChooser chooser = new JFileChooser();
chooser.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.exit(0);
}
});
final JFrame frame = new JFrame();
frame.add(chooser);
frame.pack();
frame.setVisible(true);
}
catch (final Throwable t) {
t.printStackTrace();
}
}
});
}
}
(誤った) 動作を確認するには、プログラムを実行し、タブで [キャンセル] に移動してから、[Enter] キーを押します。私のプラットフォームではプログラムが終了しませんが、[キャンセル] ボタンをクリックすると終了します。
拡張JFileChooser
とオーバーライドcancelSelection()
も機能しません (どうやら、「キャンセル」ボタンで「Enter」キーを押しても、その関数は呼び出されません)。
(誤った) 動作は、Java 5、6、および 7 を搭載した Fedora 10 x86_64 システムで発生します。
KeyEventPostProcessor
補遺: 以下は、現在に a を追加し、KeyboardFocusManager
私が望むことを行うように見えます:
import java.awt.Component;
import java.awt.KeyEventPostProcessor;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public final class TestApp {
public static void main(final String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
final JFileChooser chooser = new JFileChooser();
chooser.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
System.out.println(e.paramString());
System.exit(0);
}
});
final KeyboardFocusManager kfm = KeyboardFocusManager
.getCurrentKeyboardFocusManager();
kfm.addKeyEventPostProcessor(new KeyEventPostProcessor() {
@Override
public boolean postProcessKeyEvent(final KeyEvent e) {
if (e.getID() == KeyEvent.KEY_RELEASED
&& e.getKeyCode() == KeyEvent.VK_ENTER) {
final Component comp = e.getComponent();
if (chooser.isAncestorOf(comp)) {
if (!(comp instanceof JButton)) {
chooser.approveSelection();
}
else {
final JButton button = (JButton) comp;
if ("Cancel".equals(button.getText())) {
chooser.cancelSelection();
}
else {
chooser.approveSelection();
}
}
}
}
return false;
}
});
final JFrame frame = new JFrame();
frame.add(chooser);
frame.pack();
frame.setVisible(true);
}
catch (final Throwable t) {
t.printStackTrace();
}
}
});
}
}
ただし、「キャンセル」ボタンで Enter キーを押すことと、それ以外の場所で Enter キーを押すことを区別できるようにするだけでも、大変な作業のように思えます。
何か問題はありますか?
発見された解決策: GUI ルック アンド フィールを自分のシステム (Linux) のネイティブ ルック アンド フィールに設定すると、他に何も必要なく、必要なことが実行されます。これは私が無知であり、探していたものです。解決策は、次のようにすることです
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
メソッドの最初の実行ステートメントとしてmain()
。その後、すべてのフォーカス リスナー、主要なイベント プロセッサなどを省くことができます。
最も役に立った回答者に 100 ポイントを与えました。