Java edytowanie komórki jTable

0

Witam mam problem z przekazaniem nowych wartości do zmiennych poprzez edycje komórek jTable. Nie wiem gdzie robię błąd starałem się postępować według wskazówek z dokumentacji swing. Proszę o małą pomoc oto mój model

public class Model extends AbstractTableModel

{
Double a=0.0;
Double b=0.0;
Double c=0.0;
Double d=0.0;

private String[] columnNames = {"a","b","c","d"};
private Double[][] data = { {a,b,c,d} }; 


@Override
public int getColumnCount() {
    return columnNames.length;
}

@Override
public int getRowCount() {
    return data.length;
}

@Override
public String getColumnName(int col) {
    return columnNames[col];
}

@Override
public Object getValueAt(int row, int col) {
    return data[row][col];
}

@Override
public Class getColumnClass(int c) {
    return getValueAt(0, c).getClass();
}

@Override
public boolean isCellEditable(int row, int col) { return true;}


@Override
public void setValueAt(Object value, int row, int col) 
{
data[row][col] = (Double) value;
fireTableCellUpdated(row, col);
fireTableDataChanged();
}
    

public void wypisz()
{
    System.out.println(a);
     System.out.println(b);
      System.out.println(c);
       System.out.println(d);
}

}

public class Tablica extends javax.swing.JFrame {

Model model; 

public Tablica() 
{
    initComponents();
    model = new Model();
    jTable1.setModel(model);             
}
0

W Twoim kodzie nie ma żadnego fragmentu zmieniającego wartości zmiennych a,b,c,d.

0

Myślałem że data[row][col] = (Double) value; jest od zmiany zmiennych jak dopisać taką zmianę ?

0

Tomek_G:
Double w Javie jest wartością niemutowalną.

Przeanalizuj taki kod:

Double a = 1.0;
Double b = a;
b += 1.0;
System.out.println(a);

Ten kod wypisuje 1.0, ponieważ w linijce b += 1.0; do b został przypisany nowy obiekt typu Double.

Analogicznie, w linijce data[row][col] = (Double) value; nie zmieniasz obiektu wskazywanego przez data[row][col] tylko wstawiasz do tej komórki referencję zawartą w value.

0

Zmieniłem typ Double na double i nic się nie zmieniło

0

W przypadku double jest podobnie.

Kod:

double a = 1.0;
double b = a;
b += 1.0;
System.out.println(a);

Też wypisze 1.0, ponieważ w linijce double b = a wartość a została skopiowana do b i od tej pory są to dwie niezależne zmienne.

Jeśli chcesz się dobrać do poszczególnych komórek to musisz zrobić odpowiednie gettery, np:

double getA() {
  return data[0][0];
}
double getB() {
  return data[0][1];
}

Ewentualnie opakować double w dodatkową klasę, np:

class DoubleHolder {
  private double value;
  DoubleHolder(double value) {
    this.value = value;
  }
  getter
  setter
}

potem użyć tego w tabeli i podpiąć do niej odpowiednie renderery. Z tym, że tworzenie Holderów to byłby dość duży narzut w porównaniu do trzymania tablicy (małych) doubli.

0

ścieniasz trochę kolego
double a = 1.0;
double b = a;
b += 1.0;
System.out.println(b);

wypisywało Ci 1 bo wypisywałeś "a" zamiast b testowałem wypisało mi 2

0

Celowo wypisywałem a przecież, żeby pokazać, że te dwie zmienne zmieniają się niezależnie. Obojętnie czy użyjesz Double czy double. Ogólnie w kodzie Javowym możesz zmieniać double na Double i z powrotem i, o ile się skompiluje (bo małym doublem nie można parametryzować w Javie na przykład) to kod będzie dawał ten sam wynik.

0

To w takim razie przepraszam ale nie rozumiem jasne że będą zmieniać się niezależnie gdyż są to odmienne zmienne i mają osobno zadeklarowaną pamięć nie rozumiem jak to się ma do mojego kodu

0

W twoim kodzie masz:

    
    Double a=0.0;
     Double b=0.0;
     Double c=0.0;
     Double d=0.0;
     
     (...)
     private Double[][] data = { {a,b,c,d} };

Zainicjowałeś tablicę data referencjami do obiektów wskazywanych przez zmienne a, b, c, d - inaczej mówiąc skopiowałeś referencje (w Javie przekazywanie parametrów jest tylko poprzez wartość, z tym, że w Javie zmienne mogą przechowywać jedynie prymitywy lub referencje; referencja jest wartością). Jeżeli zmienisz referencję a to nie zmieni się referencja w tablicy, podobnie jeżeli w tablicy zmienisz referencję w dowolnej komórce to nie zmienią się referencje w polach klasy. Dalej nie rozumiesz?

0

Zmień funkcję wypisz

   public void wypisz()
    {
        System.out.println(data[0][[0]);
         System.out.println(data[0][1]);
          System.out.println(data[0][2]);
           System.out.println(data[0][3]);
    }

i zobacz efekty

0

ok chyba teraz mi wytłumaczyłeś w czym problem postaram się poprawić kod i podeśle efekt

0

Dziękuje za pomoc faktycznie muszę się przyznać do braku myślenia. Poprawiłem teraz działa jak trzeba.

@Override
public void setValueAt(Object value, int row, int col)
{
data[row][col] = (double) value;
if(col==0)
{
a=data[row][col];
}

if(col==1)
{
    b=data[row][col];
}

if(col==2)
{
    c=data[row][col];
}

if(col==3)
{
    d=data[row][col];
}

fireTableCellUpdated(row, col);
fireTableDataChanged();
}

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