2014-05-24 2 views
0

Я пытаюсь изменить значение изменения флажка при щелчке в JTable. Вот код, я использую для этого в MouseListenerСортированное возвращаемое значение JTable строкиAtPoint (Point)

public void mouseClicked(MouseEvent e) { 
    Point mouse = e.getPoint(); 
    int row = table.rowAtPoint(mouse); 
    int col = table.columnAtPoint(mouse); 
    if (col == 0) tableModel.setValueAt(new Boolean(!(Boolean) tableModel.getValueAt(row, col)), row, col); 
} 

Проблема заключается в том, что, когда я сортировать таблицу, это происходит

Problem with sorting

Вот SSCCE

import javax.swing.JFrame; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.AbstractTableModel; 

@SuppressWarnings("serial") 
public class SSCCE extends JFrame { 

    JTable table; 

    public SSCCE() { 
     setSize(300, 200); 
     Object[][] data = { {false, "This is false"}, {true, "This is true"}}; 
     table = new JTable(new CustomTableModel(data)); 
     add(table); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    private class CustomTableModel extends AbstractTableModel { 
     Object[][] data; 

     public CustomTableModel(Object[][] data) { 
      this.data = data; 
     } 

     public Class<?> getColumnClass(int columnIndex) { 
      return data[0][columnIndex].getClass(); 
     } 

     public int getColumnCount() { 
      return data[0].length; 
     } 

     public int getRowCount() { 
      return data.length; 
     } 

     public Object getValueAt(int rowIndex, int columnIndex) { 
      return data[rowIndex][columnIndex]; 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new SSCCE(); 
      } 
     }); 
    } 
} 

Есть ли способ обойти это? Или лучший метод (не ListListener) для обнаружения кликов по ячейкам?

+0

Найти решение в [Как добавить флажки в JTABLE swing] (http://stackoverflow.com/questions/7391877/how-to-add-checkboxes-to-jtable-swing), который отлично работает в вашем случае как Что ж. Вам не нужно добавлять слушателя мыши вообще. – Braj

+1

Я бы предположил, что ваша проблема в том, что вы не реализовали метод setValueAt (...) 'в своей пользовательской модели, чтобы редактор не смог сохранить обновленное значение. Нет никаких оснований создавать пользовательскую TableModel. Вы можете просто использовать 'DefaultTableModel' и переопределить метод getColumnClass (...)'. – camickr

+0

Не используйте [data [0] [columnIndex] .getClass()], чтобы определить тип столбца! что произойдет, если значение равно null? При сортировке вам нужно перевести между представлением и индексами модели. – MadProgrammer

ответ

3

Нет необходимости использовать MouseListener. Вам просто нужно использовать правильный редактор для столбца, и таблица будет обрабатывать его для вас.

Для получения дополнительной информации и рабочих примеров ознакомьтесь с разделом из учебника Swing по телефону How to Use Tables.

В основном вам нужно сделать две вещи:

  1. Добавить Boolean данные в TableModel
  2. Override getColumnClass(...) метод TableModel вернуть Boolean.class для этого столбца и таблицы будет выбрать соответствующий редактор.

Выше ответа является ответом на ваш вопрос, но для будущей информации MouseEvent относится к таблице, поэтому вы хотите использовать методы таблицы для доступа к данным. То есть вы использовали бы table.getValueAt(...) и table.setValueAt(...). Они ссылаются на данные, которые в настоящее время отображаются в представлении таблицы. Это можно сортировать, или столбец мог быть перемещен.

+0

Я мог использовать только последнюю часть. Когда я делаю две вещи, о которых вы упомянули, она только делает флажок и не обновляет его, когда я нажимаю на него. – usama8800

+0

@ usama8800 Тогда вы делаете это неправильно – MadProgrammer

+0

@MadProgrammer Проверьте мой обновленный ответ на SSCCE и, пожалуйста, покажите мне правильный способ сделать это. – usama8800