Edytor tabeli nie zmienia wartości

0

Mam tabelę z własnym modelem danych:

model = new OcenyTableModel();
table = new JTable(model);
JScrollPane scrollPane = new JScrollPane(table);

oceny = new JComboBox();
oceny.addItem("6");
oceny.addItem("5");
oceny.addItem("4");
oceny.addItem("3");
oceny.addItem("2");
oceny.addItem("1");
oceny.addItem("brak");

DefaultCellEditor editor = new DefaultCellEditor(oceny);
table.setDefaultEditor(String.class, editor);

Niestety dane w tabeli nie aktualizują się po wyborze opcji. Model tabeli wygląda tak:

public class OcenyTableModel extends AbstractTableModel {
	private List<Sprawdzian> sprawdzianList;
	private List<Uczen> uczenList;
	@Override
	public int getColumnCount() {
		return sprawdzianList.size()+3;
    }

	@Override
	public int getRowCount() {
		return uczenList.size();
    }

	@Override
	public String getColumnName(int col) {
		String nazwa;
		switch(col)
		{
			case 0: nazwa = "Imię"; break;
			case 1: nazwa = "Nazwisko"; break;
			case 2: nazwa = "Grupa"; break;
			default: nazwa = sprawdzianList.get(col-3).getNazwa();
		}
		return nazwa;
    }

	@Override
	public Object getValueAt(int row, int col) {
		switch(col)
		{
			case 0: return uczenList.get(row).getImie();
			case 1: return uczenList.get(row).getNazwisko();
			case 2: return uczenList.get(row).getGrupa().getNazwa();
			default: List<Ocena> oceny = uczenList.get(row).getOcenaList();
				if(oceny != null) {
					for(Ocena o : oceny) {
						if(sprawdzianList.get(col-3).getId() == o.getId()) {
							return o.getOcena().toString();
						}
					}
				}
		}
		return "-";
    }

	@Override
	public Class getColumnClass(int c) {
		return getValueAt(0, c).getClass();
    }
	
	public void setSprawdziany(List<Sprawdzian> x) {
		sprawdzianList = x;
	}
	
	public void setUczniowie(List<Uczen> x) {
		uczenList = x;
	}
	
	@Override
	public boolean isCellEditable(int row, int col) {
		return col>2;
	}
}

Jak widać, istnieje lista uczniów i na tej podstawie budowana jest tabela. Edytor nie wie, jak zmienić wartość. Co zrobić, aby po zmianie wartości została ona zaktualizowana, a dodatkowo wykonać operację (np. wysłać na serwer)?

1

Pamiętam że też kiedyś miałem z tym problem. Zamiast dziedziczyć z AbstractTableModel spróbuj z DefaultTableModel wtedy powinieneś mieć dostępną metodę setValueAt()

0

Działa. Pozostał AbstractTableModel. Dodałem metodę setValueAt(). Ponadto był błąd w getValueAt(). Można to uprościć, bo obecnie trzeba przelecieć wszystkie oceny i porównać sprawdziany.

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