Search code examples
javaswingjtabledatamodel

JAVA JTable datamodel columns names bug


I have the following "sample" code almost, but the column names dissapiared after ~2 hours codeing and i cant find where. Can somebody tell me why the datamodel doesnt add the column names to the JTable?

enter image description here My code:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

class MyTableModel extends JPanel {

    private static final int CHECK_COL = 3;
    private static  Object[][] DATA = {
        {"","","",false},{"","","",false},{"","","",false},{"","","",false},
        {"","","",false},{"","","",false},{"","","",false},{"","","",false},
        {"","","",false},{"","","",false},{"","","",false},{"","","",false},
        {"","","",false},{"","","",false},{"","","",false},{"","","",false},
        {"","","",false},{"","","",false},{"","","",false},{"","","",false},
        {"","","",false},{"","","",false},{"","","",false},{"","","",false},
        {"","","",false},{"","","",false},{"","","",false},{"","","",false},
        {"","","",false},{"","","",false},{"","","",false},{"","","",false}
    };
    public static String[] COLUMNS = {"Debtid","Nev","VHO", "Check"};
    protected DataModel dataModel = new DataModel(DATA, COLUMNS);
    private JTable table = new JTable(dataModel);
    private DefaultListSelectionModel selectionModel;

    public MyTableModel(){
        super(new BorderLayout());
        this.add(table);
        this.add(new ControlPanel(), BorderLayout.SOUTH);
        table.setPreferredScrollableViewportSize(new Dimension(250, 175));
        selectionModel = (DefaultListSelectionModel) table.getSelectionModel();
    }

    private class DataModel extends DefaultTableModel {

        public DataModel(Object[][] data, Object[] COLUMNS) {
            super(data, COLUMNS);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == CHECK_COL) {
                return getValueAt(0, CHECK_COL).getClass();
            }
            return super.getColumnClass(columnIndex);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return true;
        }

    }

    private class ControlPanel extends JPanel {

        /**
         * 
         */
        private static final long serialVersionUID = -7342459414751761853L;

        public ControlPanel() {
            this.add(new JLabel("Selection:"));
            this.add(new JButton(new SelectionAction("Clear", false)));
            this.add(new JButton(new SelectionAction("Check", true)));
        }
    }

    private class SelectionAction extends AbstractAction {

        boolean value;

        public SelectionAction(String name, boolean value) {
            super(name);
            this.value = value;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < dataModel.getRowCount(); i++) {
                if (selectionModel.isSelectedIndex(i)) {

                    dataModel.setValueAt(value, i, CHECK_COL);
                }
            }
        }
    }



    public void setValueAt_Cell(String val, int row, int col) {
        // TODO Auto-generated method stub
        if(row==DATA.length){
            DATA=cloneArray(DATA);
        }
        dataModel.setValueAt(val, row, col);
    }

    public static Object[][] cloneArray(Object[][] src) {
        int length = src.length;
        Object[][] target = new Object[length+1][src[0].length];
        for (int i = 0; i < length; i++) {
            System.arraycopy(src[i], 0, target[i], 0, src[i].length);
        }
        target[length] = new Object[]{"","","",false};
        return target;
    }

    public String getValAtPos(int row,int col) {
        //System.out.println(dataModel.getValueAt(row, col));
        return dataModel.getValueAt(row, col).toString();
    }

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

Solution

  • You need to wrap JTable with JScrollPane : this.add(new JScrollPane(table));.