Правильно получать данные из (отсортированного) JTable - PullRequest
12 голосов
/ 16 января 2010

Я разработал базовую пользовательскую JTableModel следующим образом

public class CustomTableModel extends DefaultTableModel {
  List<MyClass> data;
  public CustomTableModel(List<MyClass> data) {
    this.data = data;
  }

  public Class<?> getColumnClass(int columnIndex) {
    return MyClass.class;
  }

  public MyClass getValueAt(int rowIndex, int columnIndex) {
    return data.get(rowIndex);
  }

  // ...
}

Затем я использую базовый пользовательский JTableCellRenderer следующим образом

public class CustomTableCellRenderer extends JLabel implements TableCellRenderer {

  public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {

    MyClass myClass = (MyClass)value;

    lbl.setText(myClass.getString());

    return this;
  }
}

У меня также есть пользовательская JPanel, которая отображает различную информацию вследует

public class MyPanel extends JPanel {
  private MyClass myClass;

  public MyPanel(MyClass myClass) {
    // initialize components
  }

  public setMyClass(MyClass myClass) {
    this.myClass = myClass;
    updateFields();
  }

  private void updateFields() {
    this.fieldString.setText(myClass == null ? "" : myClass.getString());
    // ...
  }
}

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

public class JCustomFrame extends JFrame {
  public JCustomFrame(List<MyClass> data) {
    // ...
    JTable table = new JTable(new CustomTableModel(data));
    table.setDefaultRenderer(MyClass.class, new CustomTableCellRenderer());

  }
}

Я пытаюсь добиться получениявыбранный MyClass из таблицы независимо от сортировки .

Я пробовал ListSelectionListener, но методы не возвращают ничего, кроме выбранных индексов.Даже если у меня есть индекс, если таблица отсортирована, моя модель не настолько сложна и вернет неправильный объект.

1 Ответ

31 голосов
/ 16 января 2010

... Даже если у меня есть индекс, если таблица отсортирована, моя модель не настолько сложна и вернет неправильный объект ...

Вы должны использовать:

JTable.convertRowIndexToModel (int viewIndex)

Сопоставляет индекс строки по представлению с базовой TableModel. Если содержимое модели не отсортировано, индексы модели и вида совпадают.

С помощью этого индекса вы можете получить доступ к вашей табличной модели и посмотреть, какой объект вам нужен.

Примечание Сортировка таблиц вместе с этим методом была введена в Java 1.6

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