ورود

View Full Version : حرفه ای: چگونگی اطلاع از تغییر یک سلول در jtable



gigamax
پنج شنبه 29 اردیبهشت 1390, 10:30 صبح
سلام به همگی . من یک jtable دارم که اطلاعاتی رو از دیتابیس توش میریزم. بعضی از سلول های این جدول editable هستند. سوال من اینه که چه event ای باید fire بشه تا تغییرات هر سلول رو بتونم ردیابی کنم؟
یعنی به عنوان مثال سلولی که در ستون دوم سطر سوم واقع شده دارای نام مقدار "Ali" یه . حالا اگر کاربر نام رو به رضا تغییر داد من بتونم بفهمم و اون تغییر رو توی دییتابیس اعمال کنم.

سرچ هم که توی نت زدم فقط به دوتا چیز برخوردم که واقعا هیچ جور نفهمیدم چی داره میگه :لبخند:

http://tips4java.wordpress.com/2009/06/07/table-cell-listener/

http://download.oracle.com/javase/tutorial/uiswing/components/table.html#modelchange

واقعا ممنون میشم اگر کمکم کنید
موفق باشید

ermia2008
یک شنبه 01 خرداد 1390, 22:45 عصر
برای این کار میتونی از pattern ای به نام observer استفاده کنی
به این صورت که شما داخل table model ای که نوشتی داخل متد setValue باید یه متد fire بشه که همه کلاسهایی که
دارن به تغییرات گوش میدن با خبر بشن.
به این صورت:



public interface Observer {
public void tableDataChanged(int row,int col);
}





public class MyTableModel implements TableModel {

List<Observer> observerList = new ArrayList<Observer>();

@Override
public void setValueAt(Object o, int row, int col) {
fireTableDataChanged(row, col);
}

public void addObserver(Observer o) {
observerList.add(o);
}

public void removeObserver(Observer o) {
observerList.remove(o);
}

private void fireTableDataChanged(int row, int col) {
for (Observer observer : observerList) {
observer.tableDataChanged(row, col);
}
}


در کلاس بالا هر وقت مقداری ست میشه یعنی setValue اتفاق میفته متد fireTableDataChanged اتفاق میفته و همه کسانی که به داخل
لیست آن observer اضافه کردن رو fire میکنه

برای استفاده هم به این صورت:



MyTableModel myTableModel = new MyTableModel();
myTableModel.addObserver(new Observer() {

@Override
public void tableDataChanged(int row, int col) {
// commit changes in database
}
});