Java KeyBindings с JFileChooser

Я хотел бы добавить привязки клавиш к моему JFileChooser, чтобы открывать окно предварительного просмотра файла при нажатии клавиши ПРОБЕЛ.

Из-за того, что исходный код слишком велик, я сделал простой грязный код:

MainWindow.java

package test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MainWindow extends JFrame {    
    public MainWindow() {
        this.setTitle("Test Window");
        Dimension dim = new Dimension(800, 600);
        this.setSize(dim);
        this.setPreferredSize(dim);

        MainPanel pane = new MainPanel(dim);

        Action damned = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null,
                    "It Works !");
            }
        };

        pane.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "damned");
        pane.getActionMap().put("damned", damned);

        this.setContentPane(pane);
        this.setVisible(true);
    }
}

MainPanel.java

package test;

import java.awt.*;
import javax.swing.*;

public class MainPanel extends JFileChooser { 
    public MainPanel(Dimension dim) {  
        this.setSize(dim);
        this.setPreferredSize(dim);    
    }
}

Test.java

package test;

public class Test {
    public static void main(String[] args) {
        new MainWindow();
    }
}

Если я использую JPanel вместо JFileChooser, это работает.

Спасибо,

Реван


person R3v4n    schedule 23.11.2011    source источник


Ответы (2)


проблема в типе InputMap: по умолчанию (то есть без параметра), это WHEN_FOCUSED. Поскольку сам селектор редко фокусируется, привязка не будет найдена. Вместо этого привяжите WHEN_ANCESTOR...

       pane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
           .put(KeyStroke.getKeyStroke("F1"), "damned");

Как вы видите здесь, я заменил ПРОБЕЛ на F1: пробел нужен (и поэтому съеден) текстовым полем, которое принимает ввод имени

person kleopatra    schedule 23.11.2011
comment
Что, если вы все равно захотите заменить клавишу ПРОБЕЛ? Как ты мог это сделать? - person Daniel Kaplan; 26.04.2013

Попробуйте переопределить метод

protected JDialog createDialog(Component parent)

и добавьте свое действие в диалоговое окно, полученное из

super.createDialog(...)

dialog.getContentPane();
person StanislavL    schedule 23.11.2011