Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление элементов таблицы из кнопок из её строк 
:(
    Опции темы
BiTOk
Дата 13.10.2012, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 23.12.2010

Репутация: нет
Всего: нет



Доброе время суток. Реализую форму с таблицей, столбцами которой являются 2 комбобокса и кнопка удаления строки. Всё работает отлично, но если добавить несколько строк, после чего удалить последнюю, а потом любую другую, то получается exception в глубине JTable. В чём проблема? Реализовал так:
Код

public class OurSettings extends JFrame  {
    public OurSettings(){
        super("Настройки");
        setBounds(100, 100, 400, 400);
        getContentPane().setLayout(new BorderLayout());

        final JTable table = new JTable();
        table.setRowHeight(20);
        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane, BorderLayout.CENTER);


        JPanel butPanel = new JPanel();
        JButton btnAdd = new JButton("Добавить");
        JButton btnOk = new JButton("Ок");
        butPanel.add(btnAdd);
        butPanel.add(btnOk);
        getContentPane().add(butPanel, BorderLayout.SOUTH);

        btnAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ((DefaultTableModel)table.getModel()).addRow(new Object[]{"объект", "кто", "Удалить"});
            }
        });

        btnOk.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                OurSettings.this.setVisible(false);
            }
        });

        DefaultTableModel model = (DefaultTableModel)table.getModel();

        // Add some columns
        model.addColumn("Тип", new Object[]{"объект"});
        model.addColumn("Признак", new Object[]{"кто"});
        model.addColumn("Удалить", new Object[]{"Удалить"});

        // These are the combobox values
        String[] types = new String[]{"объект", "агент", "место", "тема"};

        String[] features = new String[]{"кто", "что", "где"};

        // Set the combobox editor on the 1st visible column
        int vColIndex = 0;
        TableColumn typesCol = table.getColumnModel().getColumn(vColIndex);
        typesCol.setCellEditor(new MyComboBoxEditor(types));

        vColIndex = 1;
        TableColumn featuresCol = table.getColumnModel().getColumn(vColIndex);
        featuresCol.setCellEditor(new MyComboBoxEditor(features));

        vColIndex = 2;
        TableColumn delCol = table.getColumnModel().getColumn(vColIndex);
        delCol.setCellEditor(new ButtonEditor(new JCheckBox()));

        // If the cell should appear like a combobox in its
        // non-editing state, also set the combobox renderer
        typesCol.setCellRenderer(new MyComboBoxRenderer(types));
        featuresCol.setCellRenderer(new MyComboBoxRenderer(features));
        delCol.setCellRenderer(new ButtonRenderer());
    }

    public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
        public MyComboBoxRenderer(String[] items) {
            super(items);
        }

        public Component getTableCellRendererComponent(JTable table, Object value,
                                                       boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                super.setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(table.getBackground());
            }

            // Select the current value
            setSelectedItem(value);
            return this;
        }
    }

    public class MyComboBoxEditor extends DefaultCellEditor {
        public MyComboBoxEditor(String[] items) {
            super(new JComboBox(items));
        }
    }

    public class ButtonRenderer extends JButton implements TableCellRenderer {

        public ButtonRenderer() {
            setOpaque(true);
        }

        public Component getTableCellRendererComponent(JTable table, Object value,
                                                       boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            } else{
                setForeground(table.getForeground());
                setBackground(UIManager.getColor("Button.background"));
            }
            setText( (value == null) ? "" : value.toString() );
            return this;
        }
    }

    public class ButtonEditor extends DefaultCellEditor {
        protected JButton button;
        private String    label;

        public ButtonEditor(JCheckBox checkBox) {
            super(checkBox);
            button = new JButton();
            button.setOpaque(true);
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fireEditingStopped();
                }
            });
        }

        public Component getTableCellEditorComponent(JTable table, Object value,
                                                     boolean isSelected, int row, int column) {
            if (isSelected) {
                button.setForeground(table.getSelectionForeground());
                button.setBackground(table.getSelectionBackground());
            } else{
                button.setForeground(table.getForeground());
                button.setBackground(table.getBackground());
            }
            label = (value == null) ? "" : value.toString();
            button.setText( label );
            ((DefaultTableModel)table.getModel()).removeRow(row);
            return button;
        }

        public Object getCellEditorValue() {
            return new String( label );
        }
    }
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.