我有一个JFileChooser
在JFrame
。我已将ActionListener
添加到JFileChooser
,以便点击时取消按钮。我也可以选择“取消”按钮,但是当我点击“Enter”键时,没有任何事情发生(即ActionListener
未使用事件命令JFileChooser.CANCEL_SELECTION
调用)。我该如何处理JFileChooser
,以便在“取消”按钮上点击“Enter”键相当于点击“取消”按钮?如何在JFileChooser中的“取消”按钮时点击“Enter”?
这里的(MIS)的一个简单的例子行为我看到:
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();
}
}
});
}
}
要查看(MIS)的行为,执行程序,标签为“取消”,然后点击“进入“键。该程序不会在我的平台上终止 - 虽然它在我点击“取消”按钮时会执行。
扩展JFileChooser
和覆盖cancelSelection()
也不起作用(很显然,当在“取消”按钮时按下“Enter”键时,该功能不会被调用)。
我的Fedora 10 x86_64的系统上发生与Java 5,6(MIS)的行为,和7
附录:下面增加了一个KeyEventPostProcessor
到当前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();
}
}
});
}
}
然而,它似乎很多工作,只是为了能够区分按下“取消”按钮与其他任何地方的输入键。
您是否看到任何问题?
发现的解决方案:设置GUI外观和感觉我的系统(Linux)的本地一个不需要任何其他东西。这是我不知道的和我在找的东西。解决方案是具有以下
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
作为main()
方法的第一个可执行语句。然后可以免除所有的焦点听众,关键事件处理器等。
我已经将100分给了最有帮助的回答者。
谢谢,我很欣赏有机会研究这个有趣的问题。这不是默认的L&F吗? – trashgod 2010-08-06 00:29:08
@trashgod默认的L&F取决于OS/JVM的组合:对于Linux或Solaris以及Sun的JVM,它是Java(跨平台)L&F;对于Windows/Sun,它是Windows L&F;对于Mac OS/X和Mac的JVM,它是Mac L&F。有关更多信息,请参阅。 –
2010-08-06 18:50:45