我有一個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