как контролировать фокус в JTable - PullRequest
3 голосов
/ 08 января 2009

То, что я хочу сделать, - это когда пользователь закончит редактирование данных в ячейке таблицы, чтобы переместить фокус на другую ячейку в зависимости от того, что пользователь ввел, и перевести эту ячейку в режим редактирования, чтобы пользователь мог сразу начать печатать без дополнительных действий. Таким образом, пользователь может сосредоточиться на своей работе, а программное обеспечение будет «думать» о том, какую ячейку следует редактировать дальше.

Простая задача, которая не выглядит так просто в реальной жизни ... Кто-нибудь, какая-нибудь идея?

Ответы [ 2 ]

5 голосов
/ 08 января 2009

Пожалуйста, попробуйте этот пример.

Это должно позволить вам перемещаться по таблице, вводя значения u, d, l, r для Up, Down, Left, Right.

Надеюсь, что это даст вам представление о том, как это сделать.

import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Test extends JFrame {

    private JTable table;
    private TableModel tableModel;

    public Test() {
        tableModel = new DefaultTableModel(5, 5);

        table = new JTable(tableModel);
        table.setColumnSelectionAllowed(true);

        getContentPane().add(table);

        Action handleEnter = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                table.getCellEditor().stopCellEditing(); // store user input
                int row = table.getSelectedRow();
                int col = table.getSelectedColumn();
                String val = String.valueOf(table.getValueAt(row, col)).toLowerCase();
                if (val.equals("u"))
                    --row;
                else if (val.equals("d"))
                    ++row;
                else if (val.equals("l"))
                    --col;
                else if (val.equals("r"))
                    ++col;
                if (     row >= 0 && row < tableModel.getRowCount()
                      && col >= 0 && col < tableModel.getColumnCount()) {
                    table.changeSelection(row, col, false, false);
                    table.editCellAt(row, col);
                }
            }
        };
        // replace action for ENTER, since next row would be selected automatically
        table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "handleEnter");
        table.getActionMap().put("handleEnter", handleEnter);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.setSize(800, 600);
        test.setVisible(true);
    }
}
0 голосов
/ 08 января 2009

Вы должны добавить KeyListener в JTable, чтобы получить все напечатанные символы. После того, как пользователь нажмет Введите , вы должны проверить слово, набранное пользователем.

Напишите свой собственный FocusTraversalPolicy, чтобы установить его в таблицу

table.setFocusTraversalPolicy(policy)

FocusTraversalPolicy описывает, какой компонент получает следующий фокус. После этого вы можете позвонить

FocusManager.getCurrentManager().focusNextComponent();

РЕДАКТИРОВАТЬ: Я не проверял это, это просто идея.

...