2009-07-13 3 views
14

Я хочу удалить некоторые строки из JTable. Как мне это сделать?Как удалить строку из JTable?

+6

Подсказка: если вы объясните, что вы уже пробовали, и что он-лайн уроки вы читали, люди будут более склонны помогать вам. Или дайте некоторый пример кода и сообщите нам, какой бит не работает. Прочтите это, если вы еще этого не сделали: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html –

ответ

3

JTable обычно формирует часть представления реализации MVC. Вы захотите удалить строки из своей модели. JTable, который должен прослушивать эти изменения, будет обновляться, чтобы отразить это удаление. Следовательно, вы не найдете removeRow() или аналогичный метод JTable.

+0

thanx для справки, но я хочу знать, как удалить строки из модель таблицы, im не получая никакого метода. – 2009-07-13 06:18:20

+1

Прочитайте такие вещи, как: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html – dave

+0

Вкратце, вы создаете пользовательскую таблицуModel. JTable не сохраняет строки, он делегирует это в TableModel. Вы можете подклассом из AbstractTableModel, если хотите. Вызывайте fireTableRowsDeleted() каждый раз, когда вы удаляете строки. – dave

3

Посмотрите на DefaultTableModel для простой модели, которые вы можете использовать:

http://java.sun.com/javase/6/docs/api/javax/swing/table/DefaultTableModel.html

Это расширяет AbstractTableModel, но должно быть достаточно для основных целей. Вы всегда можете расширить AbstractTableModel и создать свой собственный. Убедитесь, что вы установили его также в JTable.

http://java.sun.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

Посмотрите на основной Sun учебник для получения дополнительной информации об использовании JTable с табличной модели:

http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#data

33

Для того, чтобы удалить строки из JTable, вам нужно удалить целевой строки из базового TableModel. Если, например, ваш TableModel является экземпляром DefaultTableModel, вы можете удалить строку, выполнив следующие действия:

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove); 
+0

thanx для справки, но я использовал этот метод, и он не работает. на самом деле мой JTable использует модель LocationTable model (own created) extendind abstract, поэтому, когда я использую метод removeRow (i), она дает ошибку как «can not resolve removeRow()». Какую альтернативу я должен использовать. – 2009-07-13 08:50:36

+4

Хорошо, если вы созданный собственный пользовательский TableModel, тогда вы несете ответственность за создание собственного метода removeRow. Посмотрите исходный код модели DefaultTableModel, чтобы узнать, как это делается. Простое решение - использовать DefaultTableModel. Почему, по-вашему, вам нужно создать пользовательский TableModel? Пока вы не поймете, что основы использования моделей используют предоставленные по умолчанию. – camickr

4

Правильный способ применить фильтр к JTable через интерфейс RowFilter добавлен к TableRowSorter. Используя этот интерфейс, представление модели можно изменить без изменения базовой модели. Эта стратегия сохраняет парадигму Model-View-Controller, тогда как удаление строк, которые вы хотите скрывать от самой модели, нарушает парадигму, смешивая ваше разделение проблем.

8

Если вам нужно простое рабочее решение, попробуйте использовать DefaultTableModel.

Если вы создали свою собственную модель таблицы, которая расширяет AbstractTableModel, то вы также должны реализовать метод removeRow(). Точная реализация зависит от базовой структуры, которую вы использовали для хранения данных.

Например, если вы использовали вектор, то это может быть что-то вроде этого:

public class SimpleTableModel extends AbstractTableModel { 
    private Vector<String> columnNames = new Vector<String>(); 
    // Each value in the vector is a row; String[] - row data; 
    private Vector<String[]> data = new Vector<String[]>(); 

    ... 

    public String getValueAt(int row, int col) { 
     return data.get(row)[col]; 
    } 

    ... 

    public void removeRow(int row) { 
     data.removeElementAt(row); 
    } 
} 

Если вы использовали список, то это было бы очень похожи друг на друга:

// Each item in the list is a row; String[] - row data; 
List<String[]> arr = new ArrayList<String[]>(); 

public void removeRow(int row) { 
    data.remove(row); 
} 

HashMap :

//Integer - row number; String[] - row data; 
HashMap<Integer, String[]> data = new HashMap<Integer, String[]>(); 

public void removeRow(Integer row) { 
    data.remove(row); 
} 

И если вы используете массивы как этот

String[][] data = { { "a", "b" }, { "c", "d" } }; 

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

Для лучшего понимания того, как это работает, и что делать, чтобы сделать вашу собственную модель работать должным образом, я сильно советую вам обратиться к Java Tutorial, DefaultTableModel API и это source code.

3

ммм очень простые парни

for(int i = model.getRowCount() - 1; i >= 0; i--) 
{ 
    model.removeRow(i); 
} 
+1

Ничего подобного миллионным уведомлениям утром ;-) – greenoldman

Смежные вопросы