Привести объект в JTable? - PullRequest
0 голосов
/ 18 мая 2010

Я пытаюсь реализовать ListSelectionListener для некоторых из моих JTables. Просто (на данный момент) ListSelectionListener должен просто возвращать текст ячейки, которая была выбрана.

У моей программы есть несколько JTables, и я хотел бы, чтобы один ListSelectionListener работал для них всех. В событии valueChanged объекта ListSelectionListener я думал, что можно сделать что-то вроде:

private class SelectionHandler implements ListSelectionListener {
    public void valueChanged(ListSelectionEvent e)
    {
        JTable table = (JTable)e.getSource();                                                         

        String data = (String) table.getValueAt(table.getSelectedRow(), 0);

        // Print data
    }
}

За кулисами я использовал следующий код, чтобы заставить SelectionHandler работать с рассматриваемой таблицей:

fbTable.setCellSelectionEnabled(true);
ListSelectionModel cellSM = fbTable.getSelectionModel();
cellSM.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
cellSelectionModel.addListSelectionListener(selectionHandler);

При запуске программы появляется ошибка ClassCastException:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.DefaultListSelectionModel cannot be cast to javax.swing.JTable
        at cardboardfantasy.CardboardFantasyView$SelectionHandler.valueChanged(CardboardFantasyView.java:360)

// This is the line in question: JTable table = (JTable)e.getSource();

Есть ли способ сделать что-то подобное? Одним из решений, о котором я подумал, было сравнение источника события (e.getSource ()) со всеми моими JTables, чтобы увидеть, являются ли они эквивалентными (большой блок if), а затем просто вызов .getValueAt внутри этого блока, но это сделало бы код в будущем трудно, если таблицы будут добавлены или удалены.

Ответы [ 4 ]

1 голос
/ 19 мая 2010

Как следует из ошибки, рассматриваемый исходный объект является DefaultListSelectionModel, а не JTable. Это имеет смысл, поскольку источником события (то есть объектом, который вызвал событие) был объект модели выбора, а не таблица. Кроме того, модели сами по себе не предполагают, какой тип объекта использует их в качестве модели, поэтому нет способа получить ссылку на таблицу с помощью модели выбора.

1 голос
/ 18 мая 2010

Либо отладьте свой код в вашей IDE, установите точку останова и посмотрите, какой тип e.getTarget ():

Object source = e.getSource();
JTable table = (JTable)source; // breakpoint on this line and inspect the variable 'source'
String data = (String) table.getValueAt(table.getSelectedRow(), 0);

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

Object source = e.getSource();
System.out.println(source.getClass());

Но: отладка с использованием System.out.println - это зло. твой отладчик твой друг.

0 голосов
/ 19 мая 2010

Я думаю, что есть два основных решения:

  • Используйте JList и зарегистрируйте слушателя не в модели, а непосредственно в списке. Затем, если список содержится в таблице, вы можете просто попросить родительского элемента (Компонента) найти ответственную таблицу
  • Переопределите DefaultListSelectionModel, чтобы (например) получить дополнительный аргумент в конструкторе, который будет экземпляром JTable (каждая таблица будет нуждаться в новом экземпляре этой модели). Вы бы сохранили этот экземпляр в переменной экземпляра, а затем могли бы работать непосредственно с таблицей, когда происходит событие

Я не думаю, что любое из этих решений идеально. У меня есть ощущение, что вы могли бы облегчить свою жизнь, используя какой-то шаблон или идиому, чтобы обойти необходимость узнать, какой стол был источником. Но чтобы дать вам какие-то подсказки, нам нужно было бы увидеть намного больше вашего кода.

0 голосов
/ 19 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...