Как определить, какая ячейка в JTable была выбрана? - PullRequest
5 голосов
/ 18 февраля 2011

У меня есть JTable в графическом интерфейсе, и я хочу вернуть число, основанное на значении ячейки, на которую нажимает пользователь. Это код:

ListSelectionModel newmodel = mytable.getSelectionModel();
newmodel.addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        int row = mytable.getSelectedRow();
        int column = mytable.getSelectedColumn();

        int cell = getNewNum();
        datefield.setText(String.valueOf(cell));
    }
});

У меня есть пара проблем с этим. Во-первых, этот метод делает мою таблицу редактируемой. До этого я не мог редактировать таблицу, но теперь я могу удалять записи. Я посмотрел в API, но я не знаю, почему это так. Во-вторых, если я нажимаю на ячейку в строке 3, скажем, а затем нажимаю на другую строку в ячейке 3, событие не регистрируется. Как создать событие, щелкнув ячейку в выбранной строке?

1 Ответ

7 голосов
/ 18 февраля 2011

Обычный метод - получить точку, по которой пользователь щелкнул по событию:

jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
    @Override
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        int row = jTable1.rowAtPoint(evt.getPoint());
        int col = jTable1.columnAtPoint(evt.getPoint());
        if (row >= 0 && col >= 0) {
            ......

        }
    }
});

Вот второй вариант, использующий режим выбора:

jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
    jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
       @Override
       public void mouseClicked(java.awt.event.MouseEvent evt) {
           ...
           int row = jTable1.getSelectedRow();
           int col = jTable1.getSelectedColumn());
           if (evt.getClickCount() > 1) { // double-click etc...
              ...

Если вы идете:

public boolean isCellEditable(int row, int col) {
   return false;
}

Тогда ваш JTable не будет редактируемым.

Наконец, чтобы получить желаемое значение, вам просто нужно вызвать getValueAt(row,col) вашей модели JTable или получить следующее содержимое:

Object foo = jTable1.getModel().getValueAt(row, col); 
...