java - Создание редактируемой таблицы с помощью AbstractTableModel


0

Подскажите пожалуйста, имеется следующая таблица

public class ZvanieTable extends AbstractTableModel{
    private int columnCount=5;
    private ArrayList<String[]>dataArrayList;

    public ZvanieTable() {
        dataArrayList=new ArrayList<String[]>();
        for (int i=0;i<dataArrayList.size();i++)
        {
            dataArrayList.add(new String[columnCount]);
        }
    }

    @Override
    public int getRowCount() {
        return dataArrayList.size();
    }

    @Override
    public int getColumnCount() {
        return columnCount;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        String []rows=dataArrayList.get(rowIndex);

        return rows[columnIndex];
    }

    public void addZvanie(String[]row)
    {
        String[]rowTable=new String[getColumnCount()];
        rowTable=row;
        dataArrayList.add(rowTable);
    }

    @Override
    public String getColumnName(int column) {
        switch (column)
        {
            case 0:return "Звание";
            case 1:return "Дата присвоения";
            case 2:return "Приказ";
            case 3:return "№ приказа";
            case 4:return "Дата присвоения";
        }
        return "";
    }
}

вызывается следующим образом:

ZvanieTable zvt=new ZvanieTable();
        JTable zvanieJTable=new JTable(zvt);
        JScrollPane zvanieJScrollPane=new JScrollPane(zvanieJTable);
        zvanieJScrollPane.setPreferredSize(new Dimension(400,250));
        zvanieJPanel.add(zvanieJScrollPane,new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,new Insets(1,1,1,1),0,0));

        String []zvRow=new String[5];
        zvRow[0]="Герцог";
        zvRow[1]="01.01.2018";
        zvRow[2]="ВВ";
        zvRow[3]="444";
        zvRow[4]="01.01.2018";
        zvt.addZvanie(zvRow);

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

1 ответ

2

Документация Oracle

Задание типов полей, необходимо переопределить метод свою задачу

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

Возможность редактирования поля контролируется методом, его надо переопределить под свою задачу

/*
 * Dont need to implement this method unless your tables
 * editable.
 */
public boolean isCellEditable(int row, int col) {
    //Note that the data/cell address is constant,
    //no matter where the cell appears onscreen.
    if (col < 2) {
        return false;
    } else {
        return true;
    }
}

Using a Combo Box as an Editor

Setting up a combo box as an editor is simple, as the following example shows. The bold line of code sets up the combo box as the editor for a specific column.

TableColumn sportColumn = table.getColumnModel().getColumn(2);
...
JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Chasing toddlers");
comboBox.addItem("Speed reading");
comboBox.addItem("Teaching high school");
comboBox.addItem("None");
sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

результат

Сделал небольшой пример

class TestFrame extends JFrame {

    MyTable table;

    TestFrame(){
        table = new MyTable();
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(new JScrollPane(table),BorderLayout.CENTER);
        initData();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private void initData(){
        MyTableModel model = table.getModel();
        String col1 = model.getColumnName(1);
        String col2 = model.getColumnName(2);
        String col3 = model.getColumnName(3);
        for(int i = 1;i<6;i++){
            model.addRow(new Object[]{i,col1+i,col2+i,Math.random(),true});
        }
    }

    private class MyTable extends JTable{

        private MyTable() {
            super(new MyTableModel());
            JComboBox editorColumnB = new JComboBox();
            editorColumnB.addItem("B1");
            editorColumnB.addItem("B2");
            editorColumnB.addItem("B3");
            editorColumnB.addItem("B4");
            editorColumnB.addItem("B5");
            getColumn("B").setCellEditor(new DefaultCellEditor(editorColumnB));
        }

        @Override
        public MyTableModel getModel() {
            return (MyTableModel)super.getModel();
        }


    }

    private class MyTableModel extends DefaultTableModel{

        private String[] columns = {"A","B","C","D","E"};
        private Class[] types = {Integer.class,String.class,String.class,Double.class,Boolean.class};
        private Boolean[] canEdit={false,true,true,true,true};

        private MyTableModel() {
            super();
            setDataVector(new Object[][]{},columns);
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit[columnIndex];
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return types[columnIndex];
        }
    }
}
  • 29 янв 2018 2018-01-29 18:57:37