problem z JTable

0

Witam.
Mam problem z edycja komorek tabeli. Przykładowo kiedy klikne dwokrotnie w komorke z kolumny nr1 mam możliwość edycji jej, następnie jeśli kliknę dwa razy w komórke kolumnyi nr 2 wartosc tej komorki zmieni się na wartość komorki z kolumny nr 1. Wartosc z komorki w kolumnie 2 znajdzie się w kolumnie nr 3. Gdzie leży problem? Z gory dzieki za pomoc i pozdrawiam.

To moja tabela i model:

private class MyTableModel extends AbstractTableModel 
    { 
        public MyTableModel() 
        { 
            data = new ArrayList<ArrayList<Object>>(); 
            headers = new ArrayList<String>(); 
        } 
        @Override 
        public boolean isCellEditable (int x, int y) 
        { 
            return true; 
        } 
        public int getRowCount() 
        { 
            return data.size(); 
        } 

        public int getColumnCount() 
        { 
            return numberOfColumns; 
        } 

        public Object getValueAt(int rowIndex, int columnIndex) 
        { 
            return data.get(rowIndex).get(columnIndex); 
        } 
        @Override 
        public void setValueAt(Object obj, int rowIndex, int columnIndex) 
        { 
            data.get(rowIndex).add(columnIndex, obj); 
            fireTableDataChanged(); 
        } 
        public void addColumn(String header) 
        { 
            ++numberOfColumns; 
            System.out.println(numberOfColumns); 
            for(ArrayList<Object> lista : data) 
                lista.add(numberOfColumns-1, null); 
            headers.add(header); 
            fireTableStructureChanged(); 
        } 
        public String getHeader(int i) 
        { 
            return headers.get(i-1); 
        } 
        public void addRow() 
        { 
            data.add(new ArrayList<Object>(numberOfColumns)); 
            fireTableDataChanged(); 
        } 
        public void wypiszData() 
        { 
            for(ArrayList<Object> wiersz : data) 
            { 
                for(Object obj : wiersz) 
                    System.out.print(obj + " ; "); 
                System.out.println(""); 
            } 
        } 
        public void removeColumn (int index) 
        { 
            for(ArrayList<Object> lista : data) 
                lista.remove(index); 
            headers.remove(index); 
            --numberOfColumns; 
            fireTableStructureChanged(); 
        } 
         public void removeRow (int index) 
         { 
             data.remove(index); 
             fireTableRowsDeleted(index, index); 
         }    
         private ArrayList<ArrayList<Object>> data; 
         private volatile int numberOfColumns = 0; 
         private ArrayList<String> headers; 
    } 
    private class MyTable extends JTable 
    { 
        public MyTable (TableModel model) 
        { 
            super(model); 
        } 
        public String getColumnName(int column) 
        { 
            System.out.println(((MyTableModel)getModel()).getHeader(column)); 
            return ((MyTableModel)getModel()).getHeader(column); 
        } 
    }
0

Na pierwszy rzut oka podejrzany jest ten fragment

        public void setValueAt(Object obj, int rowIndex, int columnIndex)
        {
            data.get(rowIndex).add(columnIndex, obj);
            fireTableDataChanged();
        } 

dlaczego dodajesz nową kolumnę ?

0

A no wlasnie mialem pisac ze przepraszam za klopot i ze poprawilem :).

public void setValueAt(Object obj, int rowIndex, int columnIndex)
        {
            if(data.size() > rowIndex)
            {
                if(data.get(rowIndex).size() > columnIndex)
                {
                    if(data.get(rowIndex).get(columnIndex) != null)
                        data.get(rowIndex).remove(columnIndex);
                }
            }
            data.get(rowIndex).add(columnIndex, obj);
            fireTableDataChanged();
        }

Zastosowalem add poniewaz set wyrzuca mi wyjatek IndexOutOfBoundException :/. Probowalem jakos temu zaradzic przez wywolywanie ensureCapacity() przy dodawaniu kolumny do tabeli ale nie pomoglo. Pozdrawiam

0

Twoje rozwiązanie wygląda bardzo dziwnie. Zaskakujący jest też wyjątek IndexOutOfBoundsException.
Jeżeli nie chcesz pokazywać jakiejś kolumny, to powinieneś usuwać kolumnę z widoku (obiektu JTable) a nie z danych.
Numer kolumny(wiersza) w JTable i w TableModel to dwie różne rzeczy. Zapoznaj się z metodami klasy JTable

int convertColumnIndexToModel(int viewColumnIndex)
int convertColumnIndexToView(int modelColumnIndex)
int convertRowIndexToModel(int viewRowIndex)
int convertRowIndexToView(int modelRowIndex) 

1 użytkowników online, w tym zalogowanych: 0, gości: 1