View Full Version : متوجه شدن تغییرات مقادیر در فیلد یا سطر یک JTable
vahid83
شنبه 30 مرداد 1389, 11:37 صبح
سلام
من یه JTable دارم که به بعضی از ستونهاش اجازه تغییر دادم. میخوام اگه کاربر تغییری در جدولم داد متوجه بشم و ازش بپرسم که میخواد ذخیره اش کنه یا نه؟ اگه که نه مقدار جدول به همون صورت قبلی برگرده! دارم روش زیر رو امتحان میکنم. لطفاً نظرتون رو راجع به درست یا غلط بودنش بهم بگید و یا اگه روش بهتر سراغ دارید راهنماییم کنید. مطمئناً میشه از یه روش بهتر انجامش داد ولی من نمیدونم.
با اضافه کردن MouseListener به جدول و استفاده از متد mouseReleased متوجه double Click روی ستونها میشم.
با دستور:
if(evt.getClickCount() == 2)
میخوام متوجه تایپ مقدار در اون فیلد خاص بشم که فکر کنم با اضافه کردن KeyListener به جدول و استفاده از متد keyPressed میتونم متوجه این هم بشم.
مشکلم اینجاست که اگه کاربر بگه که نمی خواد تغییرات اعمال بشه من چطوری بدون اینکه از دیتابیسم استفاده کنم مقادیر رو به حالت قبلی برگردونم؟:افسرده:
bamdadd
شنبه 30 مرداد 1389, 21:38 عصر
من از GWT استفاده می کردم و یادمه چیزی به اسم ChangeListener یا ValueChangeListener و همچنین Focus Listenerداشت ، که دقیقا به درد همین کاری که شما می خواستید بکنید می خورد
برای پیاده سازی این ویژگی که می خواستید از 2 قسمت استفاده می کردم FocusListener که وقتی Focus یوزر روی قسمت خاصی از جدول می رفت مقدار اون رو داخل متغیری موقتا ذخیره می کردم که اگر کاربر Value رو تغییر داد ولی Cancel کرد بتونه وضعیت جدول رو به همون حالت قبلی بر گردونه
امیدوارم این روش در GWT کمکی به شما بکنه
vahid83
یک شنبه 31 مرداد 1389, 10:35 صبح
دوست عزیز bamdadd، ممنون از جوابتون.
راستش من در mouseReleased مقادیر سطر انتخاب شده رو داخل یه آرایه می ریزم.
بعد از TableModelListener و متد tableChanged استفاده کردم. در این متد از کاربر پرسیدم که میخواد تغییرات ذخیره بشه یا نه؟ اگه نه مقادیر اون آرایه رو با سطر انتخاب شده set می کنم. مشکل اینجاست که وقتی کاربر کلید No رو میزنه پیغام ذخیره تغییرات مکرراً نمایش داده میشه!
تا امروز نمی دونستم چرا؟ ولی الان متوجه شدم:
آخه من داشتم این کار رو تو tableChanged انجام می دادم. خوب با هر بار setکردن یه فیلد آرایه با یه فیلد از سطر انتخاب شده جدول داره change میشه! و اون پیغام نمایش داده میشه.
فکر کنم متدهایی هم که شما معرفی کردید، همین مشکل رو داشته باشند. ولی حتماً امتحانشون
می کنم. راستی شما می دونید این ...fireTable چه کار می کنه؟
bamdadd
یک شنبه 31 مرداد 1389, 12:16 عصر
متد هایی که من معرفی کردم برای GWT هستند و من تازه با J2ee برنامه می نویسم و حرفه ای و مسلط نیستم. مشکل شما رو باید دوستانی که تجربه بیشتری دارند راهنمایی کنند
متاسفم کمکی از دستم بر نیومد
vahid83
دوشنبه 01 شهریور 1389, 10:45 صبح
خواهش میکنم، عذر زحمت. آخه این اساتید جاوا یا جواب نمیدن یا به سختی جواب میدن! این شد که مزاحم شما شدم. راستی میشه یه خورده بیشتر راجع به GWT توضیح بدین. این که در چه مواردی کاربرد داره؟ بازم ممنون!
bamdadd
دوشنبه 01 شهریور 1389, 13:33 عصر
مدت ها طراحی محیط کاربری غنی شده در وب فرایند وقت گیر و غیر قابل گسترشی داشت و محصول بدست آمده غیر قابل نگهداری بود... زبان های طراحی محیط کاربری به دلیل عدم یا ضعف در پشتیبانی کامل شی گرایی در فرایند تولید محیط کاربری کارا و غنی برنامه نویسان را دچار مشکل می کردند , برنامه نویسی جاوا اسکریپ و HTML به شدت آن ها را اذیت می کرد و عدم وجود خاصیت Debug برنامه نویسان را بر آن داشت تا به فکری بیوفتند و نتیجه محصولاتی مثل gwt و jsf بود که تا حد زیادی به این مشکل را حل کردند.
GWT به علت شباهت زیاد به Swing به مزاج برنامه نویس های جاوا بسیار خوش آمد و توسعه آن با سرعت بالایی ادامه پیدا کرد , در حال حاضر GWT علاوه بر انجام پیاده سازی محیط کاربری فرایند هایی هم برای ایجاد سرویس و انتقال اطلاعات از سرور به کلاینت را پشتیبانی می کند.
به طور کلی و تجربه شخصی در صورتی که می خواهید محیط کاربری غنی داشته باشید حتما از GWT و JSF به طور هم زمان استفاده کنید.
مطالب قدیمی من را می تونی در www.iragwt.co.cc بخونی و همچنین برای مطالب به روز تر به سایت گوگل قسمت webtoolkit مراجعه کنی.
vahid83
چهارشنبه 03 شهریور 1389, 10:58 صبح
دوستان و اساتید،
کسی نیست تا جواب این سؤال باحال رو بده!؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟
من هنوز نتونستم به جواب دلخواهم برسم!
می دونم که سؤال تازه ای نیست و می دونم که جوابش رو می دونید!
من تازه کار رو لنگ نذارید تو رو خدا!
همیشه کاری می کنید که به التماس برسم. بابا منو دریابید!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
javaphantom
پنج شنبه 04 شهریور 1389, 20:26 عصر
دوستان و اساتید،
کسی نیست تا جواب این سؤال باحال رو بده!؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟
من هنوز نتونستم به جواب دلخواهم برسم!
می دونم که سؤال تازه ای نیست و می دونم که جوابش رو می دونید!
من تازه کار رو لنگ نذارید تو رو خدا!
همیشه کاری می کنید که به التماس برسم. بابا منو دریابید!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
در ادامه بیکاری اینم جواب
import javax.swing.*;
import java.text.SimpleDateFormat;
/**
* Created by IntelliJ IDEA.
* User: zack
* Date: Aug 26, 2010
* Time: 7:45:35 PM
* To change this template use File | Settings | File Templates.
*/
public class MyClock implements Runnable {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
private String clock;
private JLabel jLabel;
public MyClock(JLabel jLabel) {
this.jLabel = jLabel;
}
public void run() {
try {
while (true) {
this.jLabel.setText(this.getClock());
Thread.sleep(1000);
}
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
private String getClock() throws Exception {
this.clock = this.simpleDateFormat.format(System.currentTimeMil lis());
return this.clock;
}
}
package main;
import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import java.awt.*;
/**
* Created by IntelliJ IDEA.
* User: zack
* Date: Aug 26, 2010
* Time: 7:56:14 PM
* To change this template use File | Settings | File Templates.
*/
public class MyForm extends JFrame {
private JPanel jPanel1;
private JLabel jLabel1;
private JTable jTable1;
public MyForm() {
this.setBounds(new Rectangle(200,200));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
this.getContentPane().add(this.getJPanel1());
this.startThread();
this.setVisible(true);
}
private void startThread() {
Thread t = new Thread(new MyClock(this.getJLabel1()));
t.start();
}
public JPanel getJPanel1() {
if (this.jPanel1 == null) {
this.jPanel1 = new JPanel();
this.jPanel1.setLayout(new FlowLayout());
this.jPanel1.add(this.getJLabel1());
this.jPanel1.add(this.getJTable1());
}
return jPanel1;
}
public JLabel getJLabel1() {
if (this.jLabel1 == null) {
this.jLabel1 = new JLabel();
}
return jLabel1;
}
public JTable getJTable1() {
if (this.jTable1 == null) {
this.jTable1 = new JTable(new MyDefaultTableModel());
this.jTable1.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
System.out.println("Model has been changed");
System.out.println("e.getColumn() = " + e.getColumn());
System.out.println("e.getLastRow() = " + e.getLastRow());
}
});
}
return jTable1;
}
public static void main(String[] s) {
new MyForm();
}
}
package main;
import com.sun.deploy.panel.JreTableModel;
import javax.swing.table.DefaultTableModel;
/**
* Created by IntelliJ IDEA.
* User: zack
* Date: Aug 26, 2010
* Time: 8:19:23 PM
* To change this template use File | Settings | File Templates.
*/
public class MyDefaultTableModel extends DefaultTableModel {
private Object[] columns = {"name","family","tel"};
private Object[] rowData1 = {"babak","tt","123"};
private Object[] rowData2 = {"ali","alavi","321"};
public MyDefaultTableModel() {
this.addRow(this.rowData1);
this.addRow(this.rowData2);
}
@Override
public int getColumnCount() {
return this.columns.length;
}
@Override
public String getColumnName(int column) {
return this.columns[column].toString();
}
}
vahid83
سه شنبه 09 شهریور 1389, 09:55 صبح
سلام استاد گرامی javaphantom (http://www.barnamenevis.org/forum/member.php?u=17370)، ببخشید که دیر به این تاپیک سر زدم. آخه دیگه ناامید شده بودم.
قربونت دستت داداش، الحق که با مرامی.:لبخند:
ولی اگه پست سوم رو یه نگاه بندازی منم از همین متد استفاده کردم. مشکل من این نبود که متوجه تغییر جدول نمیشم. مشکلم این بود اگه کاربر نخواد تغییرش ذخیره بشه چطور اون فیلد تغییر یافته به مقدار قبلی برگرده! که جوابشو پیدا کردم. شاید زیاد شیک و حرفه ای نباشه (اونم به خاطر ناشی بودنم به بزرگی خودتون ببخشید) ولی یه راه حل بود: از flag استفاده کردم. به شکل زیر:
myTable.getModel().addTableModelListener(new TableModelListener()
{
public void tableChanged(TableModelEvent e)
{
if(flag)
{
if(JOptionPane.showConfirmDialog(rootPane, "Save Change?","Qestion",0,3) == 0)
{
//other .....
}
else
{
flag = false; //(1)
myTable.setValueAt(data, e.getFirstRow(), e.getColumn()); //(2)
}
}
}
});
این flag رو هم تو متد mouseReleased جدولم true می کنم، همین جا هم یه کپی از فیلدی که double click شده بر می دارم (یعنی همون data). اول جای (1) و (2) رو جابجا گذاشته بودم که باز مشکلم رو برطرف نکرد. چون اول جدولم Change میشد و اصلا به flag = false نمی رسید! ولی با جابجایی این دو خط خیلی قشنگ جواب داد.
بازم از توجهت ممنونم ولی خواهشاً زود به زود به این فوروم سر بزنید، چون حضور شما اساتیده که به ما تازه کارا دلگرمی میده!
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.