Java: как явно вставлять строки (данные) в JTable, если строки вставляются с помощью AbstractTableModel

В моем приложении есть 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, поэтому я изменил это с помощью приведенного выше кода. Но в приведенном выше коде я не могу явно вставить данные (строки), пожалуйста, помогите мне.


person Vinit ...    schedule 14.03.2012    source источник


Ответы (5)


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

Помните, что после изменения данных вы должны запустить событие таблицы, например 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);
}
person chenyi1976    schedule 14.03.2012
comment
хорошо ... если я хочу добавить строку из другого метода приложения, то какой код? - person Vinit ...; 14.03.2012
comment
+1 за расширение AbstractTableModel для пользовательского API. Но: делать это в анонимном классе не имеет особого смысла ... вероятно, это то, о чем спотыкается @VinitVikash :-) - person kleopatra; 14.03.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 или afterwords, как вы могли бы это сделать.

person Rahul Borkar    schedule 14.03.2012
comment
вам нужно использовать DefaultTableModel не обязательно: расширение AbstractXX и добавление API также помогут :-) - person kleopatra; 14.03.2012

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

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

пример о AbstractTableModel

person mKorbel    schedule 14.03.2012

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

person Peter    schedule 14.03.2012
comment
но если я использую DefaultTableModel, то я не могу использовать isCellEditable и другой метод в своей таблице, поэтому я меняю DefaultTableModel на AbstractTableModel. - person Vinit ...; 14.03.2012

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

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

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

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

person Korhan Ozturk    schedule 14.03.2012
comment
Я не хочу редактировать данные. Я хочу вставить данные или строки. - person Vinit ...; 14.03.2012