Java: Как явно вставить строки (данные) в JTable, если строки вставлены с помощью AbstractTableModel - PullRequest
1 голос
/ 14 марта 2012

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

Следующие все коды находятся в конструкторе фрейма.

Код:

private TableModel model = new AbstractTableModel(){
String[] columnNames = {"First Name","Last Name","Sport","# of Years","Vegetarian"};
private Object[][] data = {};

            public int getColumnCount() {
                return columnNames.length;
            }

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

            public String getColumnName(int col) {
                return columnNames[col];
            }
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }

            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
            public boolean isCellEditable(int row, int col) {
                retuen false;
            }
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
};

table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);

JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(5, 218, 884, 194);
//now adding this to the frame where I want to show 
frame.add(scrollPane);

Теперь я хочу вставить строки или данные в таблицу.Как это возможно.Ранее я использовал DefaultTableModel , но мы не можем использовать isCellEditable и другие методы в DefaultTableModel, поэтому я изменяю это с помощью приведенного выше кода.Но в приведенном выше коде я не могу вставлять данные (строки) явно, пожалуйста, помогите мне.

Ответы [ 5 ]

7 голосов
/ 14 марта 2012

Таким образом, вы можете реализовать другой метод, например deleteRow (int rowIndex) и insertRowToIndex (int rowIndex, List rowData).

Rememer после изменения данных, вы должны запустить событие таблицы, например fireTableRowsInserted () и т. Д.

public static class MyTableModel extends AbstractTableModel
{
    private List<String> columnNames = new ArrayList();
    private List<List> data = new ArrayList();

    {
        columnNames.add("First Name");
        columnNames.add("Last Name");
        columnNames.add("Sport");
        columnNames.add("# of Years");
        columnNames.add("Vegetarian");
    }

    public void addRow(List rowData)
    {
        data.add(rowData);
        fireTableRowsInserted(data.size() - 1, data.size() - 1);
    }

    public int getColumnCount()
    {
        return columnNames.size();
    }

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

    public String getColumnName(int col)
    {
        try
        {
            return columnNames.get(col);
        }
        catch(Exception e)
        {
            return null;
        }
    }

    public Object getValueAt(int row, int col)
    {
        return data.get(row).get(col);
    }

    public boolean isCellEditable(int row, int col)
    {
        return false;
    }

    public Class getColumnClass(int c)
    {
        return getValueAt(0, c).getClass();
    }
};

public static void main(String[] args)
{
    MyTableModel model = new MyTableModel();

    model.addRow(Arrays.asList("yi", "chen", "sleep", 35, true));

    JTable table = new JTable(model);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);

    JScrollPane scrollPane = new JScrollPane(table);
    scrollPane.setBounds(5, 218, 884, 194);
    //now adding this to the frame where I want to show 
    JFrame frame = new JFrame();
    frame.add(scrollPane);
    frame.setVisible(true);
}
1 голос
/ 14 марта 2012

AbstractTableModel не будет делать то, что вы хотите, для этого вам нужно использовать DefaultTableModel,

Когда вы используете DefaultTableModel, вы можете установить isCellEditable или любой другой метод следующими способами,

    DefaultTableModel model = new DefaultTableModel(data, columnNames) {
        private static final long serialVersionUID = 1L;

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }       
    };

в данных кода выше будет String [] [].И, написав вышеуказанный код, вы устанавливаете ячейку для редактирования как ложную.

Кроме этого, вы также можете загружать данные в Swingworker или послесловия, как вы могли бы сделать.

1 голос
/ 14 марта 2012

@ Питер прав +1, используйте DefaultTableModel вместо AbstractTableModel, потому что ваш AbstractTableModel пропущенный метод addRow(); (и другие методы тоже)

public void addRow(Object[][] data) {
    this.data.add(data);
    this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
}

пример около AbstractTableModel

1 голос
/ 14 марта 2012

Простое расширение от DefaultTableModel вместо расширения от AbstractTableModel должно помочь.

0 голосов
/ 14 марта 2012

Я думаю, вам нужно реализовать функцию setValueAt() в вашей AbstractTableModel, чтобы вы могли изменять любые данные с учетом позиции.

Внимательно изучите следующие уроки:

http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm

http://www.informit.com/articles/article.aspx?p=332278

...