Java 在jTable上使用Enter键,就像使用Tab键一样
我在项目中被困了两天,我无法实现如何使回车键像制表键一样我尝试了键侦听器,但是回车键有一个JTable的默认功能,所以它不起作用,它一直向下移动。我发现我需要使用键绑定,但我无法实现它 有人能在JTable上给我一个完整的编码示例吗???请你帮忙Java 在jTable上使用Enter键,就像使用Tab键一样,java,swing,tabs,jtable,enter,Java,Swing,Tabs,Jtable,Enter,我在项目中被困了两天,我无法实现如何使回车键像制表键一样我尝试了键侦听器,但是回车键有一个JTable的默认功能,所以它不起作用,它一直向下移动。我发现我需要使用键绑定,但我无法实现它 有人能在JTable上给我一个完整的编码示例吗???请你帮忙 提前感谢您可以在JTable的操作映射和输入映射中指定行为: InputMap im = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); Object actionKe
提前感谢您可以在
JTable
的操作映射和输入映射中指定行为:
InputMap im = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Object actionKey = new Object();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), actionKey);
table.getActionMap().put(actionKey, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent event) {
// Do something for ENTER
}
});
您谈论的默认行为出现在操作映射中,默认情况下已初始化。您可以在
JTable的操作映射和输入映射中指定该行为:
InputMap im = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
Object actionKey = new Object();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), actionKey);
table.getActionMap().put(actionKey, new AbstractAction() {
@Override
public void actionPerformed(ActionEvent event) {
// Do something for ENTER
}
});
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(enter, im.get(tab));
您谈论的默认行为出现在操作映射中,默认情况下已初始化。基本的转变是使用键绑定API,在大多数情况下,它允许您覆盖许多组件上的默认行为键
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(enter, im.get(tab));
此示例基本上将相同的命名操作应用于Enter键和Tab键,这使得通过使用单个操作
可以轻松修改它们的行为
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class Test101 {
public static void main(String[] args) {
new Test101();
}
public Test101() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable table = new JTable();
InputMap im = table.getInputMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Action.NextCell");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "Action.NextCell");
ActionMap am = table.getActionMap();
am.put("Action.NextCell", new NextCellActioin(table));
DefaultTableModel model = new DefaultTableModel(10, 10);
table.setModel(model);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class NextCellActioin extends AbstractAction {
private JTable table;
public NextCellActioin(JTable table) {
this.table = table;
}
@Override
public void actionPerformed(ActionEvent e) {
int col = table.getSelectedColumn();
int row = table.getSelectedRow();
int colCount = table.getColumnCount();
int rowCount = table.getRowCount();
col++;
if (col >= colCount) {
col = 0;
row++;
}
if (row >= rowCount) {
row = 0;
}
table.getSelectionModel().setSelectionInterval(row, row);
table.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
}
}
}
Tab的功能是通过focus manager更改默认的焦点行为来控制的,正如我所记得的基本的转变是使用键绑定API,这将允许您在大多数情况下覆盖许多组件上的默认行为键
此示例基本上将相同的命名操作应用于Enter键和Tab键,这使得通过使用单个操作
可以轻松修改它们的行为
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class Test101 {
public static void main(String[] args) {
new Test101();
}
public Test101() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JTable table = new JTable();
InputMap im = table.getInputMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Action.NextCell");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "Action.NextCell");
ActionMap am = table.getActionMap();
am.put("Action.NextCell", new NextCellActioin(table));
DefaultTableModel model = new DefaultTableModel(10, 10);
table.setModel(model);
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class NextCellActioin extends AbstractAction {
private JTable table;
public NextCellActioin(JTable table) {
this.table = table;
}
@Override
public void actionPerformed(ActionEvent e) {
int col = table.getSelectedColumn();
int row = table.getSelectedRow();
int colCount = table.getColumnCount();
int rowCount = table.getRowCount();
col++;
if (col >= colCount) {
col = 0;
row++;
}
if (row >= rowCount) {
row = 0;
}
table.getSelectionModel().setSelectionInterval(row, row);
table.getColumnModel().getSelectionModel().setSelectionInterval(col, col);
}
}
}
选项卡的功能是通过焦点管理器更改默认焦点行为来控制的,正如我回忆的那样im.get(Tab)
返回null
。我记得,JTable
通过@MadProgrammer修改默认的焦点横向行为,JTable使用自定义操作在表单元格之间进行制表。查看列出所有默认绑定的“我的程序”。关键是使用“祖先”输入映射来获取制表键击键的标识符。@camickr谢谢,这让我有点吃惊im.get(tab)
返回null
。我记得,JTable
通过@MadProgrammer修改默认的焦点横向行为,JTable使用自定义操作在表单元格之间进行制表。查看列出所有默认绑定的“我的程序”。关键是使用“祖先”输入映射来获取制表键击键的标识符。@camickr谢谢,这让我有点吃惊,我记得,JTable
通过修改默认的焦点横向行为,制表符不是通过键绑定控制的。我在这里不使用制表键。问题是关于ENTER键的,这就是我在这里使用的。我假设您对默认行为的引用是针对tab键的。我记得,JTable
通过修改默认焦点横向行为,tab不通过键绑定控制。我在这里不使用tab键。问题是关于ENTER键,这就是我在这里使用的。我假设您对默认行为的引用是针对tab键的。我正在使用netbeans,那么我应该如何初始化JTable table=new JTable();InputMap im=table.getInputMap();im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),“Action.NextCel”);im.put(KeyStroke.getKeyStroke(KeyEvent.VK_选项卡,0),“Action.NextCell”);ActionMap am=table.getActionMap();am.put(“Action.NextCell”,新的NextCellaction(表))代码>我在NetBeans中编写了这个示例,你是说你使用表单编辑器吗?在你的示例中,public Test101(){}
是初始化部分,我不能正常编辑它,我必须在设计中使用自定义代码!!好的,那么您将在代码中的某个地方有一个JTable
的引用(例如,它默认为jtable1
)。在类构造函数中调用initComponents
方法后,您应该应用键绑定,使用JTable
的引用代替我的表
,这是我正常使用tab键时的另一件事!!我跳过了最后一列,插入了一个新行!!一切正常,但新行不是自动选择的setRowSelectionTerral()
正在引发空点异常!!我正在使用netbeans,所以我应该如何初始化JTable table=newjtable();InputMap im=table.getInputMap();im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),“Action.NextCel”);im.put(KeyStroke.getKeyStroke(KeyEvent.VK_选项卡,0),“Action.NextCell”);ActionMap am=table.getActionMap();am.put(“Action.NextCell”,新的NextCellaction(表))代码>我在NetBeans中编写了这个示例,你是说你使用表单编辑器吗?在你的示例中,public Test101(){}
是初始化部分,我不能正常编辑它,我必须在设计中使用自定义代码!!好的,那么您将在代码中的某个地方有一个JTable
的引用(例如,它默认为jtable1
)。在类构造函数中调用initComponents
方法后,您应该应用键绑定,使用JTable
的引用代替我的表
,这是我正常使用tab键时的另一件事!!我跳过了最后一列,插入了一个新行!!一切正常,但新行不是自动选择的setRowSelectionTerral()
正在引发空点异常!!尽管这是可能的,但我不会为下一个单元格锁定ENTER键,您必须(复杂化)覆盖TableCellEditor的stopCellEditing,不要混淆用户,让它用于鲸鱼和使用标准,相同的命令在MsExcel中等。