Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Сохранение значений в ячейках JTable


Автор: Александр26091982 26.5.2019, 10:57
Подскажите пожалуйста каким образом можно сохранить измененное значение в ячейке, после примененного редактора.
В данном примере, в ячейках к которым применен редактор измененное значение почему-то не сохраняется.
Код

public class KadrPress extends JFrame {
    public KadrPress() throws HeadlessException {
        super("Кадровая работа");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.add(levayaJTable());
        this.setExtendedState(MAXIMIZED_BOTH);
        this.setVisible(true);
 
    }
 
    //Модель основной таблицы
    private JTable levayaJTable() {
        String[] dannie = new String[]{
                "Фамилия", "Имя", "Отчество", "Число, месяц, год рождения",
                "Место рождения (согласно паспорта)", "Серия и номер паспорта", "Дата выдачи", "Кем выдан",
                "Код подразделения", 
                "Кем выдано", "ИНН"
        };
        JTable levayaJTable = new JTable(new OsnovTable(dannie));
        levayaJTable.setRowHeight(20);
        levayaJTable.setOpaque(false);
        levayaJTable.getColumnModel().getColumn(1)
                .setCellEditor(new MaskEditor(new JFormattedTextField()));
 
        return levayaJTable;
    }
 
    //Модель основной таблицы
    private class OsnovTable extends AbstractTableModel {
        String[] dannie;
        HashMap<String, String> data = new HashMap<>();
 
        public OsnovTable(String[] dannie) {
            this.dannie = dannie;
        }
 
        @Override
        public int getRowCount() {
            return dannie.length;
        }
 
        @Override
        public int getColumnCount() {
            return 2;
        }
 
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            if (columnIndex == 0) return dannie[rowIndex];
            if (columnIndex == 1) return data.get(dannie[rowIndex]);
            return null;
        }
 
        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            if (columnIndex == 0) return false;
            if (columnIndex == 1) return true;
            return false;
        }
 
        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            System.out.println(aValue.toString());
            data.put(dannie[rowIndex], (String) aValue);
        }
    }
 
    //Создание редактора таблицы
    private class MaskEditor extends DefaultCellEditor {
        public MaskEditor(JTextField textField) {
            super(textField);
        }
 
        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            JFormattedTextField result = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column);
            MaskFormatter dateMask;
            try {
                if (table.getModel().getValueAt(row, 0).equals("Число, месяц, год рождения")
                        || table.getModel().getValueAt(row, 0).equals("Дата выдачи")) {
                    dateMask = new MaskFormatter("##.##.####");
                    result = new JFormattedTextField(dateMask);
                }
                if (table.getModel().getValueAt(row, 0).equals("Серия и номер паспорта")) {
                    dateMask = new MaskFormatter("#### ######");
                    result = new JFormattedTextField(dateMask);
                }
                result.setBorder(new LineBorder(null, 0));
                return result;
            } catch (ParseException e) {
                e.printStackTrace();
            }
 
            return result;
        }
    }
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new KadrPress();
            }
        });
    }
}

Автор: LSD 27.5.2019, 11:45
Отображение узнает о том, что данные изменились через механизм событий. Когда данные в модели поменялись, модель должна разаслать событие, что данные поменялись fireTableCellUpdated(row, column).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)