Search code examples
javaswingjtableabstracttablemodel

AbstractTableModel - don't return getRowCount()


here is code where i add table model to my table:

table = new JTable(new TerminiTableModel());
scrollPane = new JScrollPane(table);

then i made this class TerminiTableModel() and here is just a simple generated code where i want to get column cound and row count... Column count works just fine and add 3 columns to my table ("Termini", "Ime i prezime" and "Napomena"). When i add that line in getRowCount, i get error and cant even compile it... Here is code... I made search about this and just cant figure it out... :-/

public class TerminiTableModel extends AbstractTableModel implements TableModel {

    protected TableModel tableModel;

    private String[] columnNames = {"Termin", "Ime i prezime", "Napomena"};
    private String[] data = {"7:00", "8:00", "9:00" , "10:00" , "11:00" , "12:00" };

    @Override
    public void addTableModelListener(TableModelListener arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public Class<?> getColumnClass(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

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

    @Override
    public int getRowCount() {
        return data.length;   //  <<----- this line is problem
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    @Override
    public Object getValueAt(int row, int col) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        if (col > 0) {
            return true;
        } else
        return false;
    }

    @Override
    public void removeTableModelListener(TableModelListener arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void setValueAt(Object data, int row, int col) {
        // TODO Auto-generated method stub
    }
}

Solution is probably simple, but i need some help with this... Thank You in advance...


Solution

  • EDIT based on commnets

    rows in JTable is based on two Dimensional arrays, then

    private String[] data = {"7:00", "8:00", "9:00" , "10:00" , "11:00" , "12:00" };
    

    should be

    private String[][] data = {{"7:00", null, null}, {"8:00", null, null}, 
                {"9:00", null, null}, {"10:00", null, null}, {"11:00", null, null}, 
                {"12:00", null, null}};
    

    for defined Columns

    enter image description here

    from code

    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    
    public class MyTable {
    
        private JFrame frame = new JFrame("TableDemo");
        private JScrollPane tableScroll = new JScrollPane();
        private MyTableModel tableModel = new MyTableModel();
        private JTable dialogTable = new JTable(tableModel);
    
        public MyTable() {
            dialogTable.setPreferredScrollableViewportSize(dialogTable.getPreferredSize());
            tableScroll = new JScrollPane(dialogTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
            frame.add(tableScroll);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
            System.out.println(dialogTable.getRowCount());
            System.out.println(dialogTable.getColumnCount());
            System.out.println(tableModel.getRowCount());
            System.out.println(tableModel.getColumnCount());
        }
    
        private class MyTableModel extends AbstractTableModel {
    
            private String[] columnNames = {"Termin", "Ime i prezime", "Napomena"};
            private String[][] data = {{"7:00", null, null}, {"8:00", null, null}, 
                {"9:00", null, null}, {"10:00", null, null}, {"11:00", null, null}, 
                {"12:00", null, null}};
    
            @Override
            public void addTableModelListener(TableModelListener arg0) {
                // TODO Auto-generated method stub
            }
    
            @Override
            public Class<?> getColumnClass(int columnNames) {
                switch (columnNames) {
                    case 0:
                        return String.class;//return Date.class;
                    case 1:
                        return String.class;//return Double.class;
                    case 2:
                        return String.class;//return Boolean.class;
                    default:
                        return String.class;
                }
            }
    
            @Override
            public int getColumnCount() {
                return columnNames.length;
            }
    
            @Override
            public int getRowCount() {
                return data.length;   //  <<----- this line is problem
            }
    
            @Override
            public String getColumnName(int col) {
                return columnNames[col];
            }
    
            @Override
            public Object getValueAt(int row, int col) {
                // TODO Auto-generated method stub
                return null;
            }
    
            @Override
            public boolean isCellEditable(int row, int col) {
                if (col > 0) {
                    return true;
                } else {
                    return false;
                }
            }
    
            @Override
            public void removeTableModelListener(TableModelListener arg0) {
                // TODO Auto-generated method stub
            }
    
            @Override
            public void setValueAt(Object data, int row, int col) {
                // TODO Auto-generated method stub
            }
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    MyTable myTable = new MyTable();
                }
            });
        }
    }