我想在我的应用程序中的任何位置(Control +
S)触发保存操作。我已经添加了必要的键绑定,并且该操作将按预期触发。但是,如果我在JTable上尝试Control +
S,则该表将启动我的自定义操作并激活该表单元格以进行编辑。我想我已经在表格的输入映射中禁用了编辑操作。我在这里想念什么?
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;
}
}
像@Guillaume一样,我运行您的代码没问题。您可能会在这里讨论过CellEditor
无意中失败的情况。一个SSCCE可能有助于澄清问题。editingStopped()
附录:您可以在saveAction()
处理程序中取消编辑,如下所示。
table.editingCanceled(null);
供参考,我在几个方面更新了您的示例:
Control-S
不受任何JTable
Action
常见的外观实现的约束,因此无需删除它。getMenuShortcutKeyMask()
。码:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
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;
public class TestTableKeyBinding extends JFrame {
private static final int MASK =
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
private JTable table;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
TestTableKeyBinding test = new TestTableKeyBinding();
test.setVisible(true);
}
});
}
TestTableKeyBinding() {
super();
initUI();
addKeyBindings();
}
private 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);
this.add(new JScrollPane(table));
this.pack();
this.setSize(new Dimension(300, 400));
}
private 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(KeyEvent.VK_S, MASK), "save");
am.put("save", saveAction());
}
private AbstractAction saveAction() {
AbstractAction save = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(
TestTableKeyBinding.this.table, "Action Triggered.");
table.editingCanceled(null);
}
};
return save;
}
}
问题内容: 我的目标是在编辑器上以VK-ENTER结尾的任何输入,它执行操作pindah(正在添加新行并设置光标在新行上闪烁)。抱歉,我无法从该示例中学习。 有办法吗? 这是我的代码(不包括导入,因为Eclipse会自动建议它): 问题答案: 不是答案,而是关于您代码的一些注释。 首先,您需要了解事件调度线程(EDT)。GUI组件的更新需要在EDT上完成。 通常,您不需要保留嵌套的SwingUti
问题内容: 我正在开发用于库存管理的应用程序。 操作是,通过在中键入项目代码并按键,该代码的详细信息应显示在。在这里,我必须输入数量,然后按计算数量。但是,现在通过提供商品代码,详细信息到达,我可以键入数量,但是通过按键将焦点移到下一行,并且不进行任何计算。但是,再次按键,将计算出最后输入的金额。我是Java的初学者,所以我不知道如何解决此问题。我在Netbeans中使用MySQL和Java。 我
我有一个jTable,它由使用bean绑定的数据库中的数据填充。我想为表实现一个搜索函数。我遇到了以下教程,它使用bean绑定实现了这一点: https://weblogs.java.net/blog/pkeegan/archive/2008/06/using_beans_bin.html 我无法使它工作。当我运行我创建的示例应用程序时,我看到搜索文本字段上出现了一个意外的值,如“javax.sw
问题内容: 我需要绑定所有箭头键以执行相同的功能,但是每次获取按下哪个键时。目前我只有通过以下方式按下向右箭头键时才有 但是我需要这样的东西 问题答案: 您要问的实际上是违反直觉的,并且违背了键绑定API的设计。 目的是为每个按键提供单个工作单元。在我看来,这建议您应为每个箭头键分别执行操作。 它使您更容易遵循逻辑,进行更改,根据需要规避操作。 但是我是谁呢? 如果看不到它,一种简单的方法就是为每
按键绑定 你可以激活keyBindings选项来支持键盘控制。默认情况下iScroll监听方向键,上下翻页建,home/end键,但这些按键绑定完全可以自定义。 你可以通过传递一个包含按键代码列表的对象来进行按键绑定。 默认的按键值如下: keyBindings: { pageUp: 33, pageDown: 34, end: 35, home: 36,
前面我们已经向您介绍了键绑定 map! <M-j> <Down> 尖括号及其中的内容,为 Vim 配置文件的约定,分别描述了按键和功能,表示将功能编写到按键上。如果绑定的只是普通字符,例如: map! xxx XXXXX 表示将 XXXXX 绑定到 xxx 上。当您键入 xxx 时,编辑器会自动替换为 XXXXX 如果您只是想将字符串绑定为缩写,方便输入,我们建议您使用 iabbrev 来绑定。例