У меня есть JFileChooser
в JFrame
.Я добавил ActionListener
к JFileChooser
, чтобы при нажатии работала кнопка «Отмена».Я также могу перейти на кнопку «Отмена», но когда я нажимаю клавишу «Ввод», ничего не происходит (т. Е. ActionListener
не вызывается с командой события JFileChooser.CANCEL_SELECTION
).Что я должен делать с JFileChooser
, чтобы нажатие клавиши «Ввод» при нажатии кнопки «Отмена» эквивалентно нажатию кнопки «Отмена»?
Вот простой пример (неправильного)поведение, которое я вижу:
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();
}
}
});
}
}
Чтобы увидеть (не) поведение, запустите программу, перейдите на вкладку «Отмена», а затем нажмите клавишу «Ввод».Программа не завершает свою работу на моей платформе - хотя это происходит, когда я нажимаю кнопку «Отмена».
Расширение JFileChooser
и переопределение cancelSelection()
также не работают (очевидно, эта функция нене вызывается при нажатии клавиши «Ввод» при нажатии кнопки «Отмена».
Поведение (неправильное) происходит в моей системе Fedora 10 x86_64 с Java 5, 6 и 7.
ADDENDUM: следующее добавляет 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 Look and Feel для родного длямоя система (Linux) делает то, что я хочу, без необходимости чего-либо еще.Это то, что я не знал и что искал.Решение заключается в следующем
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
в качестве первого исполняемого оператора метода main()
.Затем можно обойтись без всех слушателей фокусировки, ключевых обработчиков событий и т. Д.
Я присудил 100 баллов самому полезному респонденту.