Question

In my application there is a JTable and I want to insert row after creating table.

Following all codes are in the constructor of the frame.

Code:

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

now I want to insert rows or data into the table. How this is possible. Previously I used DefaultTableModel but we cannot use isCellEditable and other method in DefaultTableModel so I change that with the code above. But in the above code I am not able to insert data (rows) explicitly, please help me.

Was it helpful?

Solution

Like this, you can implement other method like deleteRow(int rowIndex) and insertRowToIndex(int rowIndex, List rowData).

Rememer after you change the data, you have to fire the table event, like fireTableRowsInserted() etc

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

OTHER TIPS

AbstractTableModel will not do what you want to do, For this purpose you need to use DefaultTableModel,

When you use DefaultTableModel you can set isCellEditable or any other method in following ways,

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

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

in above code data will be String[ ][ ]. And by writing above code you are setting cell editable as false.

Other than this you can also load data in swingworker or afterwords like you might have done.

@Peter is right +1 use DefaultTableModel rather than AbstractTableModel, because your AbstractTableModel missed method addRow(); (and another methods too)

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

example about AbstractTableModel

Just extending from DefaultTableModel instead of extending from AbstractTableModel should do the trick.

I think you need to implement setValueAt() function in your AbstractTableModel so that you can modify any data given the position.

Take a close look at the following tutorials:

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

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top