Modyfikacja JTable

0

Mam pytanie w związku z wykrywaniem zmian dokonywanych w komórkach JTable. Nie znalazłem bezpośredniej metody, który pozwala na określenie, czy dane modelu tabeli (lub tabeli) zostały zmodyfikowane. Ale widzę, że po zmodyfikowaniu tych danych każdorazowo wywoływana jest metoda fireTableCellUpdated(int row, int column). We własnej klasie modelu tabeli nadpisałem tą metodę i chce przechwytywać zmiany i wykonywać coś w innej cześci aplikacji, jeśli te dane po zmianie rzeczywiście będą inne. Robię więc tak:

  • tworzę pole: private FormattedTableModel primaryModel;
  • implementuje interfejs Cloneable
  • nadpisuję metodę wywoływaną przy updacie danych w komórkach:
public void fireTableCellUpdated(int row, int column)
	{
		super.fireTableCellUpdated(row, column);
		
		if(primaryModel != null)
		{
			String primaryValue = (String)primaryModel.getValueAt(row, column);
			String modifiedValue = (String)this.getValueAt(row, column);
			
			if(!primaryValue.equals(modifiedValue))
					//kod wykonywany po modyfikacji danych
		}
		
		try {
			primaryModel = (FormattedTableModel)this.clone();
		} catch (CloneNotSupportedException ex) {
			ex.printStackTrace();
		}
	}

Czemu jednak po modyfikacji danych w tabeli ulega modyfikacji sklonowany obiekt ? Przecież primaryModel to już nie jest referencja do tego samego obiektu. Poza tym jeśli ktoś ma lepszy pomysł na rozpoznawanie statusu tabeli to prosiłbym o wskazówki.

0

Bo klonowanie jest płytkie. Oryginalny i sklonowany obiekt posiadają referencje do tych samych obiektów. Inaczej mówiąc:

b = a.clone();
ac = a.getC();
bc = b.getC();
ac==bc; //true

Musisz dokonać głębokiego klonowania, czyli klonować też zawartość pól.

0

Lepiej do przechwytywania edycji tabeli nadaje sie chyba klasa implementujaca interfejs TableModelListener zawsze kiedy zmienia się zawartosc komorki tabeli wywolywana jest jej metoda public void tableChanged(TableModelEvent e), a ze zdarzenia mozesz juz pobrac wiersz i kolumne komorki. Pozdrawiam

0

Pamietam, że z tej metody zrezygnowałem .. o ile to ten sam listener, no ale innego z taką metodą chyba nie ma :). Na pewno wywoływany jest przy zmianie danych wewnątrz komórki, a nie przy zmianie wyglądu tabeli ? Jak np. zmiana szerokości kolumn, kolejności i inne podobne zabiegi.

Wg dokumentacji "This fine grain notification tells listeners the exact range of cells, rows, or columns that changed. ".

0

Rzeczywiście - działa. Coś musiałem wcześniej przeoczyć.

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