TextArea使用JTable中的“Tab”进行聚焦

时间:2011-09-12 15:06:45

标签: java swing jtable

我能够使用鼠标点击将焦点设置到JTable中的单个单元格,但是当使用选项卡在单元格之间移动时,下一个选定的选项卡单元格似乎突出显示,而不是聚焦。

有没有办法使用“Tab”键设置单元格的焦点?

3 个答案:

答案 0 :(得分:4)

覆盖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();
        }
    }

};

答案 1 :(得分:3)

在选择时,您需要编辑单元格和请求焦点。 )另请注意,您需要为列事件和行事件添加选择侦听器。)


实施例

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);
}

答案 2 :(得分:3)

对我来说,方法#2出现问题,鼠标选择后的标签将焦点转移到第一列而不是下一列。我通过在super.changeSelection声明之后调用if来修复它。

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);
}