JTable Key Bindings
Möchte ich zum auslösen einer Aktion speichern, die irgendwo in meiner Anwendung (Strg+S). Ich habe die notwendige Tastenkombination, und die action-Trigger wie erwartet. Allerdings, wenn ich versuche mit Strg+S auf einer JTable die Tabelle beginnt meine eigene Aktion und aktiviert die Zelle zur Bearbeitung. Ich glaube, ich habe deaktiviert die Aktion Bearbeiten in der Tabelle input-Karte. Was vermisse ich hier?
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
public class TestTableKeyBinding extends JFrame{
JTable table;
JScrollPane scroll;
public static void main(String[] args){
TestTableKeyBinding test = new TestTableKeyBinding();
test.setVisible(true);
}
TestTableKeyBinding(){
super();
initUI();
addKeyBindings();
}
void initUI(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String[] headers = new String[]{"apples", "bananas"};
String[][] data = new String[][]{{"1", "2"},{"4","6"}};
table = new JTable(data, headers);
table.setCellSelectionEnabled(true);
scroll = new JScrollPane();
scroll.setViewportView(table);
this.add(scroll);
this.pack();
this.setSize(new Dimension(300, 400));
}
void addKeyBindings(){
//root maps
InputMap im = this.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = this.getRootPane().getActionMap();
//add custom action
im.put(KeyStroke.getKeyStroke("control S"), "save");
am.put("save", saveAction());
//disable table actions via 'none'
table.getInputMap().put(KeyStroke.getKeyStroke("control S"), "none");
table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("control S"), "none");
table.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("control S"), "none");
table.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control S"), "none");
((InputMap)UIManager.get("Table.ancestorInputMap")).put(KeyStroke.getKeyStroke("control S"), "none");
}
AbstractAction saveAction(){
AbstractAction save = new AbstractAction(){
public void actionPerformed(ActionEvent e) {
//TODO Auto-generated method stub
JOptionPane.showMessageDialog(TestTableKeyBinding.this.table, "Action Triggered.");
}
};
return save;
}
}
- Ich habe keine Probleme ausführen dieses Codes auf Win7 JDK1.6.
- Das Problem passiert, wenn Sie
Control + S
nach der Auswahl einer Zelle in der Tabelle. Die Aktion ausgelöst wird, und die ausgewählte Zelle betritt Bearbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie @Guillaume ich hatte kein problem mit den code. Vielleicht schauen Sie für eine
CellEditor
dass versehentlich NiederlageneditingStopped()
, diskutiert hier. Ein sscce kann helfen, zu klären, das problem.Nachtrag: Sie können Abbrechen, die Bearbeitung in der
saveAction()
handler, wie unten gezeigt.Referenz, ich habe aktualisiert Ihre Beispiel in mehrfacher Hinsicht:
JTable
Action
im gemeinsamen Look & Feel-Implementierungen, so dass es keine Notwendigkeit gibt, entfernen es.getMenuShortcutKeyMask()
.Code:
table.editingCancelled(null)
ist genau das, was ich suchte.Ich fand es schließlich heraus. Es gibt keine Tastenkombination festlegen, wird die Aktion der Karte nicht vorhanden ist. Also die Aufrufe zu setzen, waren nicht etwas zu tun.
JTable übergibt die Schlüssel-Ereignis editCellAt es ausgelöst, um die Tabelle Bearbeiten zu können. Es gibt zwei Möglichkeiten, um dieses. 1) Fügen Sie eine Aktion hinzu Referenz auf die JTable input/Aktion-Karten oder 2) überschreiben editCellAt den Wert false zurück. Hier ist, wie ich bekam rund um das Thema.