Добавление/Удаление строки в таблице, редакция

 
0
 
Java
ava
darkvivi | 04.10.2013, 14:19
 Доброго времени суток! Возник вопрос по поводу добавления строки в таблице, и с её редактированием. Дело в том, что стоит только её подредактировать, как ячейка возвращает своё предыдущее значение..что делать?)) И ещё -как можно в этом же коде удалять строку?
Всем огромное спасибо заранее :)


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();//обновляем данные
    }
}

Comments (4)
ava
Mirkes | 04.10.2013, 18:13 #
Вообще говоря после редактирования значение ЯЧЕЙКИ кладется на место следующим методом:


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



Метод прописан в интерфейсе и должен быть таким smile
ava
darkvivi | 04.10.2013, 18:27 #
 В интерфейсе? Вроде как этот метод у меня присутствует в MyModel...
То есть, после редактирования, нужно этот метод вызывать? А как тогда его отлавливать?  smile 
А это поможет с удалением строк?
Заранее спасибо  smile 
ava
Mirkes | 04.10.2013, 20:49 #
Этот метод должен вызываться редактором в момент окончания редактирования, а уж никак не Вами!

Далее, этот метод предназначен для редактирования значений ячейки в уже существующей строке таблицы.
Никогда этого не делал, но по моему в модели есть метод добавления строки и метод удаления строки. На самом деле оказывается их нет. Тогда сделайте сами и не забудьте оповестить 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);
        }
    }
    }

ava
darkvivi | 04.10.2013, 21:44 #
 Спасибо, попробую разобраться! smile 
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit