我可以使用鼠标单击来设置 JTable 中单个单元格的焦点,但是使用 Tab 切换单元格时,下一个选中的单元格只是被突出显示,没有焦点。
有没有办法使用 "Tab" 键来设置单元格的焦点?
重写JTable的changeSelection()方法:
JTable table = new JTable(...)
{
// Place cell in edit mode when it 'gains focus'
public void changeSelection(
int row, int column, boolean toggle, boolean extend)
{
super.changeSelection(row, column, toggle, extend);
if (editCellAt(row, column))
{
Component editor = getEditorComponent();
editor.requestFocusInWindow();
// ((JTextComponent)editor).selectAll();
}
}
};
对我来说,方法2出现了一个问题,即在鼠标选择后按Tab键会将焦点移到第一列而不是下一列。我通过在if
语句后调用super.changeSelection
来修复它。
public void changeSelection(final int row, final int column, boolean toggle, boolean extend)
{
if (editCellAt(row, column))
{
getEditorComponent().requestFocusInWindow();
}
super.changeSelection(row, column, toggle, extend);
}
在选择单元格后,您需要编辑该单元格并请求焦点。同时注意,您需要为列和行事件添加选择监听器。
public static void main(String[] args) throws Exception {
final JTable t = new JTable(4, 4);
t.setCellSelectionEnabled(true);
ListSelectionListener l = new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (t.editCellAt(t.getSelectedRow(), t.getSelectedColumn()))
t.getEditorComponent().requestFocus();
}
};
t.getSelectionModel().addListSelectionListener(l);
t.getColumnModel().getSelectionModel().addListSelectionListener(l);
JFrame frame = new JFrame("Test");
frame.add(t);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}