Šta je novo?

[JAVA] undo komanda za menjanje sadrzaja celije

milos_r

Čuven
Učlanjen(a)
31.10.2004
Poruke
488
Poena
619
Pozdrav,
imam problem sa pravljenjem undo komande za menjanje celije u tabeli. Napravio sam model koji nasledjuje AbstractTableModel i u metodi isCellEditable hvatam dogadjaj promene vrednosti u celiji. Metoda izgleda ovako:
Kod:
Command komanda;
NizKomandi nizZaUbacivanjeKomandi;
public boolean isCellEditable(int row, int col) {
	komanda = new KomandaMenjanjaCelije(this, (Integer) getValueAt(row, col), row, col);
	nizZaUbacivanjeKomandi.addCommand(komanda);		
		return true;
}
OK da bi bilo jasnije evo i klase KomandaMenjanjaCelije
Kod:
public class KomandaMenjanjaCelije implements Command{

	MyTableModel mtm1;
	Integer novaVrednosta;
	Integer strarVrednost;
	int red;
	int kolona;
	
	
	public KomandaMenjanjaCelije(MyTableModel mtm, Integer novaVrednost, int red, int kolona)
	{
		this.mtm1 = mtm;
		this.novaVrednosta = (Integer) novaVrednost;
		this.red = red;
		this.kolona = kolona;
		this.strarVrednost = (Integer) mtm1.getValueAt(red, kolona);
	}
	
	public void execute() {
		mtm1.setValueAt(novaVrednosta, red, kolona);
		
	}

	public void undo() {
		mtm1.setValueAt(strarVrednost, red, kolona);
	}
}
A evo i klase koja upravlja komadnama i omogucava undo/redu za bilo koju komandu
Kod:
public class NizKomandi {
	
	private Stack<Command> mainStack = new Stack<Command>();
	private Stack<Command> redoStack = new Stack<Command>();
	private Command command;

	public void addCommand(Command c) {
		c.execute();
		mainStack.add(c);
		redoStack.clear();
	}

	public void undoCommand() {
		command = mainStack.pop();
		command.undo();
		redoStack.push(command);
	}

	public void redoCommand() {
		command = redoStack.pop();
		command.execute();
		mainStack.push(command);
	}

}
Konkretno ova implementacija mi recimo lepo radi za dodavanje reda ili brisanje reda u tabeli, tada undo redo radi lepo. Medjutim za menjanje celija neradi.
Ako ima neko neku ideju kako ovo da odradim bio bih mu zahvalan.
Mogu prikaciti i ceo kod ako mislite da je potrebno.
Unapred hvala
Milos
 
Evo da javim da sam resio problem.😀
U principu morao sam dve stvari da promenim. Kao prvo promenio sam modifikator metodama i promenljivima klase NizKomandi posto iz nekog razloga nije dozvoljavalo da je u dve klase instanciram klasicnim putem.
Pod dva morao sam pozivanje komande za izmenu celije da premestim iz metode isCellEditable u metodu setValueAt. Pa sam samim tim morao i da sam implementiram menjanje sadrzaja celije tako sto sam direktno pristupao arraylisti koja sadrzi podatke za tabelu. Evo da bi bilo jasnije stavicu kod mozda nekom nekad zatreba.

Milos

Kod:
public class NizKomandi {
	
	private static Stack<Command> mainStack = new Stack<Command>();
	private static Stack<Command> redoStack = new Stack<Command>();

	private static Command command;

	public static void addCommand(Command c) {
		c.execute();
		mainStack.add(c);
		redoStack.clear();
	}

	public static void undoCommand() {
		command = mainStack.pop();
		command.undo();
		redoStack.push(command);
	}

	public static void redoCommand() {
		command = redoStack.pop();
		command.execute();
		mainStack.push(command);
	}

}

Kod:
public class KomandaMenjanjaCelije implements Command{

	MyTableModel mtm1;
	Integer novaVrednosta;
	Integer strarVrednost;
	int red;
	int kolona;
	
	
	public KomandaMenjanjaCelije(MyTableModel mtm, Integer novaVrednost, int red, int kolona)
	{
		this.mtm1 = mtm;
		this.novaVrednosta = (Integer) novaVrednost;
		this.red = red;
		this.kolona = kolona;
		this.strarVrednost = (Integer) mtm1.getValueAt(red, kolona);
	}
	
	public void execute() {
		MyTableModel.podaci.get(red).set(kolona, novaVrednosta);
		mtm1.fireTableCellUpdated(red, kolona);		
	}

	public void undo() {
		MyTableModel.podaci.get(red).set(kolona, strarVrednost);
		mtm1.fireTableCellUpdated(red, kolona);
	}
}

Kod:
public class MyTableModel extends AbstractTableModel {


	private static final long serialVersionUID = -3599475461589888674L;

	private static String[] columnNames = { "1", "2", "3" };	
	static ArrayList<ArrayList<Integer>> podaci = new ArrayList<ArrayList<Integer>>();
	Command komanda;
	
	public MyTableModel()
	{
		super();
				
		for (int i = 0; i < 1; i++){
			ArrayList<Integer> row = new ArrayList<Integer>();
			for (int j = 0; j < columnNames.length; j++)
				row.add(0);
			podaci.add(row);
		}
	}
	
	public void addRow(){
		ArrayList<Integer> row = new ArrayList<Integer>();
		for (int j = 0; j < columnNames.length; j++)
			row.add(0);
		podaci.add(row);
	}
		
	public int getColumnCount() {
		return columnNames.length;
	}

	public int getRowCount() {
		return podaci.size();
	}
	
	public String getColumnName(int col) {
		return columnNames[col];
	}

	public Object getValueAt(int row, int col){
		return podaci.get(row).get(col);
	}

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

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

	public void setValueAt(Object value, int row, int col) {
		komanda = new KomandaMenjanjaCelije(this, (Integer) value, row, col);
		NizKomandi.addCommand(komanda);
	}
}
 
Nazad
Vrh Dno