JTable zapis wartości zmienionej komórki do txt

0

Witam stworzyłem sobie tabelę i własny edytor. Chcę zapisać całą zawartość JTable do pliku txt muszę po prostu zapisać tablicę, nie mam z tym żadnego problemu. Chciałbym usprawnić to trochę tabelę można edytować ale tylko poszczególne kolumny, jak aktualizuję tablicę to wertuję całą tabelę co jest trochę mało efektywne jak wartość została zmieniona np. w jednej komórce, czy istnieje jakaś metoda która np. sprawdza ile komórek zostało edytowanych albo sprawdza czy dana komórka była edytowana, albo jakaś metoda do przeciążenia (czyt. słuchacz)?

EDIT:
Ewentualnie mam taki pomysł żeby do metody getTableCellEditorComponent dodać tablicę która wypełnia mi tabelę i w niej zmieniać od razu wartości

0

JTable nie znam zbyt dobrze ale pomyślałem sobie że możesz zrobić to w taki sposób:

 class Field {
private String value;
private boolean modification;

public Field(String value, boolean modification) {
this.value = value;
this.modification = modification;
}

public String getModification {
...
}

...



}


//a potem gdzieś w kodzie ta tablica

Field[][] = new Field[row][colum];


i jak modyfikujesz jakieś pole to ustawiać pole modification jako true np?

0

Nie rozumiem jak chcesz zwiększyć efektywność zapisując tylko zmienione komórki. Jeżeli tylko niektóre kolumny są edytowalne, to zapisuj tylko wartości z tych kolumn.

0

@bogdans: mam tablicę 68x7 i taką samą tabelę (JTable) kolumny 1,2,3,7 nie są edytowane, np. zmienię wartość w kolumnie 4 w wierszu 2 muszę do tablicy zapisać na nowo całą kolumnę czy jest jakaś metoda która działa podobnie jak ActionPerformed tzn. jeśli edytuję jakąś komórkę to wywoła mi się metoda z argumentami typu int row int col String text?

0

W pierwszym poście pisałeś o zapisywaniu do pliku.
Zdanie "mam tablicę 68x7 i taką samą tabelę (JTable)" jest lekko bez sensu". Masz na myśli, że model tabeli jest tablicą 68x7?
Skoro musisz zapisywać całą kolumnę tzn. że coś skopałeś w kodzie. Wystarczy napisać metodę

    public void setValueAt(Object value, int r, int c) 
    {
       ...
    }  
0

utworzenie tabeli

	private Object [][] rate=new Object[11][2]; // ona jest już wypełnion
	private String [] columnsName=new String[]{"Nazwa","Cena"};
	JTable rateTab=new JTable(new TbModel(rate,columnsName));

model tabeli

public class TbModel extends DefaultTableModel{
	public TbModel(Object [][]row,String [] col){
		super (row,col);
	}
	public boolean isCellEditable(int row,int col){
		return col==0? false:true;
	}
}

edytor tabeli

public class CurrencyEditor extends AbstractCellEditor implements TableCellEditor{
	private JFormattedTextField component;
	private MaskFormatter mask=null;
	public CurrencyEditor(){
		try{
			mask = new MaskFormatter("***** zł");
			mask.setValidCharacters("1234567890, ");
			component=new JFormattedTextField(mask);
		}catch(ParseException e){
		}
	}

	@Override
	public Object getCellEditorValue() {
		// TODO Auto-generated method stub
		return component.getText();
	}

	@Override
	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
		// TODO Auto-generated method stub
		component.setText(((String)value));
		component.setFont(new Font("Arial",Font.PLAIN,20));
		return component;
	}
}

jak zmienię wartość danej komórki to zmienia mi się w tabeli ale nie zmienia się w tablicy i teraz chcę zaktualizować tą tablicę gdy coś zmienię.

0

Powstawiaj sensownie znaczniki kodu w poprzednim poście.
Tablica powinna być modelem dla tabeli, wtedy wszystko dzieje się automatycznie.

0

Teraz ten kod można czytać. Mam dwa pytania:

  • "zmienia mi się w tabeli ale nie zmienia się w tablicy", w jakiej tablicy ma się zmienić?
  • w poprzednim poście pisałem o metodzie setValueAt, gdzie ona jest? Powinna być w modelu, zapewne starczy taka metoda:
public void setValueAt(Object ob, int row, int col)
{
     rate[row][col] = ob;
}
0

Już odpowiadam :)

  1. Wartość mi się zmienia w tabeli w gui ale nie zmienia mi się w tej tablicy o nazwie rate.
  2. Wystarczy jak dodam tą metodę setValueAt w takiej postaci jak podałeś? Oraz muszę ją tylko umieścić w modelu tabeli nie w edytorze?
0

Tylko w modelu, metod zostanie wywołana automatycznie po edycji komórki.
Mały OT: jaki jest związek tytułu wątku z Twoim problemem?

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