Mnożenie komórek w JTable

0

Mam tabelę a w niej jedną edytowalną kolumnę. Chcę by inna kolumna była iloczynem tej edytowalnej przez np. 2 (tzn każda komórka jest iloczynem edytowanej i 2 w tym samym wierszu).
Jeśli nie zmieniam wartości w tej edytowalnej kolumnie wszystko jest ok jeśli natomiast zmienię to przy liczeniu dostaje błąd:

String cannot be cast to java.lang.Integer

Wszystko dzieje się tutaj:

    public void setValueAt(Object ilosc, int rowIndex, int columnIndex){
        wiersze[rowIndex][columnIndex] = ilosc;
        if(columnIndex == 3){
            wiersze[rowIndex][columnIndex+1]=(int)wiersze[rowIndex][columnIndex]*2;
        }    
    }

Nie mogę więc użyć wartość wpisanej teraz ale tej wpisanej wcześniej tak.
Jak to obejść?

0

Naucz się konwertować String na liczby.

Integer.pareseInt(string);

Jak następne banalne pytanie umieścisz w dziale Java, to od razu wywalę do kosza.

0

Zapewniam Cię, że potrafię konwertować, lecz konwertowanie w ten sposób odpada już w przedbiegach bo kompilator wyrzuca:

cannot find symbol
symbol: method parseInt(Object)
location: class Integer

Prosił bym by temat wrócił do forum Javy bo problem spotkałem szukając już na innych forach i był bez odpowiedzi więc nie jest chyba taki dla Newbie.

0

Imo, problem jest banalny, a Ty nie potrafisz konwertować. Słyszałeś o rzutowaniu?

0

No to mi pokaż w jaki sposób na moim przykładzie.

0
Integer.parseInt((String)wiersze[rowIndex][columnIndex]);
0

Oto co zwraca kompilator przy takiej konwersji:

Niepoprawna operacja na bieżącej pozycji kursora.
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

Jakieś inne pomysły jak to zrobić?

0

Mamy zgadywać co przechowujesz w tablicy wiersze?

 Z pierwszego komunikatu błędu wynikało, że Stringi.
int value;
if(wiersze[rowIndex][columnIndex] instanceof String)
    value = Integer.parseInt((String)wiersze[rowIndex][columnIndex]);
else
    value = wiersze[rowIndex][columnIndex];

Jesteś pewien, że ten błąd zwraca kompilator? Bo ja jestem pewien, że nie kompilator.

0

Jest to tablica obiektów tak jak to w podstawowym JTableModel się spotyka. Tak to wygląda na początku.

    private Object[][] wiersze = {{"1.", "aaa", "", "", ""},
                                     {"2.", "bbb", "", "", ""},
                                     {"3.", "ccc", "", "", ""},
                                     {"4.", "ddd", "", "", ""},
        };

A wstawiam wartości tak jak wyżej pisałem metodą setValueAt.

Tak jak pisałem nie wiem czy dobrze myślę ale według mnie problem nie jest w konwersji bo gdy wcześniej wywołam metodę setValuAt a potem wykonuje działanie na edytowanej komórce to wszystko jest ok problem jest gdy edytuję ją klikając w tabelkę i od razu ma się coś obliczyć.

0

Masz działający przykład. W tabeli dwie pierwsze kolumny są edytowalne. Pierwsza kolumna zawiera Liczby (Integer), pozostałe kolumny zawierają Stringi. Wartość czwartej kolumny jest wyliczana jako iloczyn pierwszych dwóch kolumn.

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

public class TabelkaModel extends AbstractTableModel
{
    private Object[][] dane = new Object[8][4];
    //------------------------
    public TabelkaModel()
    {
        Random r = new Random();
        for(int i=0;i<dane.length;i++)
        {
            dane[i][0] = r.nextInt(10);
            dane[i][1] = r.nextInt(10)+"";
            dane[i][2] = r.nextInt(10)+"";
            dane[i][3] = "";
        }
    }
    //------------------------
    public Object[][] getDane()
    {
        return dane;
    }
    //------------------------
    public int getRowCount()
    {
        return dane.length;
    }
    //------------------------
    public int getColumnCount()
    {
        return dane[0].length;
    }
    //------------------------
    public Object getValueAt(int row,int col)
    {
        return dane[row][col];
    }
    //------------------------
    public void setValueAt(Object value,int row,int col)
    {
        if (col <= 1)
        {
            if(col == 0)
            {
                dane[row][col] = (Integer)value;
            }
            else
            {
                dane[row][col] = (String)value;
            }
            dane[row][3] = (Integer)dane[row][0]*Integer.parseInt((String)dane[row][1])+"";
        }
    }
    //---------------------------
    public Class getColumnClass(int col)
    {
        if(col == 0)
        {
            return Integer.class;
        }
        else
        {
            return String.class;
        }
    }
    //---------------------------
    public String getColumnName(int col)
    {
        return "Kol. "+(col+1);
    }
    //------------------------
    public boolean isCellEditable(int row,int col)
    {
        if(col >= 2)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

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