Как удалить строку из JTable? [закрыто]

Конец для редактирования строк строки запроса URL

После множества трудностей и возиться с классом Uri и другими решениями, вот моя строка для решения моих проблем.

using System;
using System.Collections.Specialized;
using System.Linq;
using System.Web;

public static class StringExtensions
{
    public static string AddToQueryString(this string url, params object[] keysAndValues)
    {
        return UpdateQueryString(url, q =>
        {
            for (var i = 0; i < keysAndValues.Length; i += 2)
            {
                q.Set(keysAndValues[i].ToString(), keysAndValues[i + 1].ToString());
            }
        });
    }

    public static string RemoveFromQueryString(this string url, params string[] keys)
    {
        return UpdateQueryString(url, q =>
        {
            foreach (var key in keys)
            {
                q.Remove(key);
            }
        });
    }

    public static string UpdateQueryString(string url, Action<NameValueCollection> func)
    {
        var urlWithoutQueryString = url.Contains('?') ? url.Substring(0, url.IndexOf('?')) : url;
        var queryString = url.Contains('?') ? url.Substring(url.IndexOf('?')) : null;
        var query = HttpUtility.ParseQueryString(queryString ?? string.Empty);

        func(query);

        return urlWithoutQueryString + (query.Count > 0 ? "?" : string.Empty) + query;
    }
}
14
задан Andrei Botalov 28 June 2012 в 02:44
поделиться

5 ответов

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

4
ответ дан 1 December 2019 в 06:05
поделиться

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

3
ответ дан 1 December 2019 в 06:05
поделиться

Посмотрите на 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

3
ответ дан 1 December 2019 в 06:05
поделиться

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

((DefaultTableModel)myJTable.getModel()).removeRow(rowToRemove);
35
ответ дан 1 December 2019 в 06:05
поделиться

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

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

Например, если вы использовали Vector, это может быть примерно так:

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);
    }
}

Если вы использовали List, то это было бы очень похожи:

// 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" } };

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

Чтобы лучше понять, как это работает, и что делать, чтобы ваша собственная модель работала должным образом, я настоятельно советую вам обратиться к Учебник по Java , DefaultTableModel API и его исходный код .

8
ответ дан 1 December 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: