Hallo liebe Community,
in meinem Programm versuche ich per KeyBindings einen JDialog dazu zu bewegen per escape zu schließen.
Mein Problem ist, das das Binding nur funktioniert wenn ich zB eine JComboBox ausgewählt habe, nicht aber zB wenn ich das Fenster selektiert habe (selbst wenn ich den dialog auf setFocusable(true) setze nicht).
Wenn es wenigstens funktionieren würde sobald ich ein JTextfield ausgewählt habe aber auch das Funktioniert nicht...
Ich dachte mit "getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)" wären alle Komponenten des JDialogs abgedeckt dem scheint nicht so...
Hier mal ein CodeBeispiel:
Nur ein Demo Schnipsel, aber auch bei dem funktioniert das drücken des Escape knopfes (besser gesagt das Auftreten des Events) nur bei der ComboBox..nicht aber bei einem TextField
Kann mir hier jemand helfen?
Und bitte nicht "Setz doch n Key Listener auf den Dialog" - darüber habe ich schon nachgedacht, aber soweit ich weiß, ist das "unschön" und bei Swing sollte mit bindings gearbeitet werden...
zählen mnemonics eig zu bindings oder eher zu keylistener?
Danke schon im Voraus,
beste Grüße
Mas
in meinem Programm versuche ich per KeyBindings einen JDialog dazu zu bewegen per escape zu schließen.
Mein Problem ist, das das Binding nur funktioniert wenn ich zB eine JComboBox ausgewählt habe, nicht aber zB wenn ich das Fenster selektiert habe (selbst wenn ich den dialog auf setFocusable(true) setze nicht).
Wenn es wenigstens funktionieren würde sobald ich ein JTextfield ausgewählt habe aber auch das Funktioniert nicht...
Ich dachte mit "getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)" wären alle Komponenten des JDialogs abgedeckt dem scheint nicht so...
Hier mal ein CodeBeispiel:
Java:
package keybinding.with.textfield;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
public class MainFrame {
JDialog dlg = null;
JFrame frm = new JFrame();
private static final long serialVersionUID = 4190695545886155565L;
/**
* @param args
*/
public static void main(final String[] args) {
new MainFrame().run();
}
public void run() {
setDefaults();
addButton();
this.frm.setVisible(true);
}
private void addButton() {
final JButton btncreateDlg = new JButton("create Dialog");
this.frm.add(btncreateDlg);
btncreateDlg.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent arg0) {
createDialog();
addKeyBounds();
MainFrame.this.dlg.setVisible(true);
}
});
}
private void setDefaults() {
this.frm.setSize(400, 600);
this.frm.setLayout(new GridBagLayout());
this.frm.setLocationRelativeTo(null);
this.frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
protected void createDialog() {
this.dlg = new JDialog();
this.dlg.setLayout(new GridBagLayout());
this.dlg.setSize(200, 200);
final GridBagConstraints constraints = new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.LINE_START, GridBagConstraints.BOTH,
new Insets(5, 5, 5, 5), 0, 0);
this.dlg.add(new JComboBox(new Object[] { "bla", "blub" }), constraints);
constraints.gridy = 1;
this.dlg.add(new JTextField(), constraints);
constraints.gridy = 2;
this.dlg.add(new JTextField(), constraints);
constraints.gridy = 3;
this.dlg.add(new JTextField(), constraints);
constraints.gridy = 4;
this.dlg.add(new JComboBox(new Object[] { "bla", "blub" }), constraints);
constraints.gridy = 5;
this.dlg.add(new JTextField(), constraints);
this.dlg.setLocationRelativeTo(this.frm);
}
protected void addKeyBounds() {
final KeyStroke escapeStroke = KeyStroke.getKeyStroke((char) KeyEvent.VK_ESCAPE);
final InputMap inputMap = this.dlg.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
final ActionMap actionMap = this.dlg.getRootPane().getActionMap();
inputMap.put(escapeStroke, "escapeAction");
actionMap.put("escapeAction", escapeAction());
}
public Action escapeAction() {
final Action escapeAction = new AbstractAction() {
@Override
public void actionPerformed(final ActionEvent arg0) {
System.err.println("EscapeAction");
}
};
return escapeAction;
}
}
Nur ein Demo Schnipsel, aber auch bei dem funktioniert das drücken des Escape knopfes (besser gesagt das Auftreten des Events) nur bei der ComboBox..nicht aber bei einem TextField
Kann mir hier jemand helfen?
Und bitte nicht "Setz doch n Key Listener auf den Dialog" - darüber habe ich schon nachgedacht, aber soweit ich weiß, ist das "unschön" und bei Swing sollte mit bindings gearbeitet werden...
zählen mnemonics eig zu bindings oder eher zu keylistener?
Danke schon im Voraus,
beste Grüße
Mas