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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление/Удаление строки в таблице, редакция 
:(
    Опции темы
darkvivi
Дата 4.10.2013, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 Доброго времени суток! Возник вопрос по поводу добавления строки в таблице, и с её редактированием. Дело в том, что стоит только её подредактировать, как ячейка возвращает своё предыдущее значение..что делать?)) И ещё -как можно в этом же коде удалять строку? 
 Всем огромное спасибо заранее smile

Код

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
 
public class addTable extends JFrame{
    //myData будет хранилищем для наших данных,
    // ArrayList используется просто для примера
    private ArrayList<String[]> myData;
    private MyModel model; // наша модель таблицы
    private int countNewRow = 0; // счетчик новых строк
 
    public addTable(){
        super("Add Table");
        //super("Delete Table");
        createFrame();
    }
 
    public static void main(String[] arg){
        addTable at = new addTable();
        JTable full = at.createTable();
        at.add(new JScrollPane(full));
        at.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        at.pack();
        at.setVisible(true);
    }
 
    public void createFrame(){
        setLayout(new BorderLayout());
        JButton addButton = new JButton("Add Data");
        JButton deleteButon = new JButton("Delete Data");
 
        
        
        
        
        
        addButton.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                //добавляем данные через модель таблицы
                model.setValueAt(new String[]{ "новая" + String.valueOf(countNewRow),
                        "новая" + String.valueOf(countNewRow)
                        , "новая" + String.valueOf(countNewRow) });
                countNewRow++;
                
            }
        });
        add(addButton, BorderLayout.SOUTH);
        
        
        
        
        
    }
 
    public JTable createTable(){
        myData = new ArrayList<String[]>();
        myData.add(new String[]{ "1", "2", "3" });
        myData.add(new String[]{ "11", "21", "31" });
        myData.add(new String[]{ "12", "22", "32" });
        myData.add(new String[]{ "13", "23", "33" });
        //myData.remove(0);
       // myData.
        
      
        model = new MyModel(myData);//создаем модель таблицы и предаем начальные данные
        JTable table = new JTable(model);//создаем таблицу и передаем туда модель
        
        //table.isCellEditable(1,1);
         //return true;
         //};
        
        return table;
    }
}



Код

import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;

public class MyModel extends AbstractTableModel{
 
    private ArrayList<String[]> myData; // хранилище данных на основе
                                        // которых строится таблица
 
    public MyModel(ArrayList<String[]> myData){
        this.myData = myData;
    }
 
    @Override
    public int getRowCount(){
        return myData.size();//количество строк = размер ArrayList myData
    }
 
    @Override
    public int getColumnCount(){
        return myData.get(0).length;//количество строк = размер массива String в ArrayList myData
    }
 
    @Override
    public Object getValueAt(int rowIndex, int columnIndex){
        return myData.get(rowIndex)[columnIndex];
    }
    
   public boolean isCellEditable( int row, int col ) { return true; }
 
    public void setValueAt(String[] newData){
        myData.add(newData);//добавляем в наш ArrayList новые данные
        fireTableDataChanged();//обновляем данные
    }
}


PM MAIL   Вверх
Mirkes
Дата 4.10.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вообще говоря после редактирования значение ЯЧЕЙКИ кладется на место следующим методом:

Код

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    }



Метод прописан в интерфейсе и должен быть таким smile


--------------------
Mirkes
PM MAIL   Вверх
darkvivi
Дата 4.10.2013, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 В интерфейсе? Вроде как этот метод у меня присутствует в MyModel... 
 Точнее, он не совсем такой. Я прописал в MyModel этот метод, лучше не стало :(
 То есть, после редактирования, нужно этот метод вызывать? А как тогда его отлавливать?  smile 
 А это поможет с удалением строк? 
 Заранее спасибо  smile 

Это сообщение отредактировал(а) darkvivi - 4.10.2013, 18:32
PM MAIL   Вверх
Mirkes
Дата 4.10.2013, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Этот метод должен вызываться редактором в момент окончания редактирования, а уж никак не Вами! 

Далее, этот метод предназначен для редактирования значений ячейки в уже существующей строке таблицы.
Никогда этого не делал, но по моему в модели есть метод добавления строки и метод удаления строки. На самом деле оказывается их нет. Тогда сделайте сами и не забудьте оповестить JTable об изменениях в структуре с помощью одного из методов:
Код

//
//  Fire methods
//

    /**
     * Notifies all listeners that all cell values in the table's
     * rows may have changed. The number of rows may also have changed
     * and the <code>JTable</code> should redraw the
     * table from scratch. The structure of the table (as in the order of the
     * columns) is assumed to be the same.
     *
     * @see TableModelEvent
     * @see EventListenerList
     * @see javax.swing.JTable#tableChanged(TableModelEvent)
     */
    public void fireTableDataChanged() {
        fireTableChanged(new TableModelEvent(this));
    }

    /**
     * Notifies all listeners that the table's structure has changed.
     * The number of columns in the table, and the names and types of
     * the new columns may be different from the previous state.
     * If the <code>JTable</code> receives this event and its
     * <code>autoCreateColumnsFromModel</code>
     * flag is set it discards any table columns that it had and reallocates
     * default columns in the order they appear in the model. This is the
     * same as calling <code>setModel(TableModel)</code> on the
     * <code>JTable</code>.
     *
     * @see TableModelEvent
     * @see EventListenerList
     */
    public void fireTableStructureChanged() {
        fireTableChanged(new TableModelEvent(this, TableModelEvent.HEADER_ROW));
    }

    /**
     * Notifies all listeners that rows in the range
     * <code>[firstRow, lastRow]</code>, inclusive, have been inserted.
     *
     * @param  firstRow  the first row
     * @param  lastRow   the last row
     *
     * @see TableModelEvent
     * @see EventListenerList
     *
     */
    public void fireTableRowsInserted(int firstRow, int lastRow) {
        fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
                             TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT));
    }

    /**
     * Notifies all listeners that rows in the range
     * <code>[firstRow, lastRow]</code>, inclusive, have been updated.
     *
     * @param firstRow  the first row
     * @param lastRow   the last row
     *
     * @see TableModelEvent
     * @see EventListenerList
     */
    public void fireTableRowsUpdated(int firstRow, int lastRow) {
        fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
                             TableModelEvent.ALL_COLUMNS, TableModelEvent.UPDATE));
    }

    /**
     * Notifies all listeners that rows in the range
     * <code>[firstRow, lastRow]</code>, inclusive, have been deleted.
     *
     * @param firstRow  the first row
     * @param lastRow   the last row
     *
     * @see TableModelEvent
     * @see EventListenerList
     */
    public void fireTableRowsDeleted(int firstRow, int lastRow) {
        fireTableChanged(new TableModelEvent(this, firstRow, lastRow,
                             TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE));
    }

    /**
     * Notifies all listeners that the value of the cell at 
     * <code>[row, column]</code> has been updated.
     *
     * @param row  row of cell which has been updated
     * @param column  column of cell which has been updated
     * @see TableModelEvent
     * @see EventListenerList
     */
    public void fireTableCellUpdated(int row, int column) {
        fireTableChanged(new TableModelEvent(this, row, row, column));
    }

    /**
     * Forwards the given notification event to all
     * <code>TableModelListeners</code> that registered
     * themselves as listeners for this table model.
     *
     * @param e  the event to be forwarded
     *
     * @see #addTableModelListener
     * @see TableModelEvent
     * @see EventListenerList
     */
    public void fireTableChanged(TableModelEvent e) {
    // Guaranteed to return a non-null array
    Object[] listeners = listenerList.getListenerList();
    // Process the listeners last to first, notifying
    // those that are interested in this event
    for (int i = listeners.length-2; i>=0; i-=2) {
        if (listeners[i]==TableModelListener.class) {
        ((TableModelListener)listeners[i+1]).tableChanged(e);
        }
    }
    }




--------------------
Mirkes
PM MAIL   Вверх
darkvivi
Дата 4.10.2013, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 Спасибо, попробую разобраться! smile 
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.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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