ورود

View Full Version : سوال: چرا از SwingUtilities.invokeLater استفاده می کنیم؟



[younes]
سه شنبه 04 آذر 1393, 04:23 صبح
چرا از SwingUtilities.invokeLater استفاده می کنیم؟






public static void main(String[] args){

SwingUtilities.invokeLater(() -> {

JFrame frame= new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setSize(500,300);
frame.setVisible(true);

});

}

محمد فدوی
سه شنبه 04 آذر 1393, 11:56 صبح
دلیل به اینجا برمیگرده که Swing اساسا ریسمان-امن (Thread safe) نیست. یعنی باید هرگونه تغییرات و Update که قراره توی Swing رخ بده توسط یه ریسمان انجام بشه. به این ریسمان که همه کارارو واسه Swing میکنه میگن Event Dispatch Thread یا EDT.
شما اگه بیرون از ریسمان EDT باشی (مثل همین متد main) باید کارهای Swing رو با یه تاخیر به EDT بسپاری. البته اگه دقت کنی, حتی اگه اینکار رو هم نکنی مشکلی پیش نمیاد معمولا ولی ممکنه نتایج عجیبی به بار بیاره برای برنامه.

اینو (http://stackoverflow.com/questions/7196889/swingutilities-invokelater) ببین.

vahid-p
سه شنبه 04 آذر 1393, 23:19 عصر
خب یه سوال برای من پیش اومد. با توجه به چیزهایی که تو لینکی که دادین نوشته، فرض کنید شما برای یک Event اینو مینویسید :

btn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
OtherClass.calculate();
}
});

خب فرض کنید محاسبات Calculate سنگین و زمان بر باشه اونوقت EDT رو freeze میکنه. خب حالا چه راهی هست که ما EDT رو اشغال نکنیم؟ تنها راهی که خودم به ذهنم میرسه که همونجا یه Thread دیگه درست کنیم، ولی باز هم ممکنه به نتیجه Thread نیاز داشته باشیم و از طرفی نمیخوایم EDT فریز بشه.
چه راهی پیشنهاد میدین؟

محمد فدوی
سه شنبه 04 آذر 1393, 23:43 عصر
چاره ای نیست به نظر بهترین راه همون چیزیه که خودت گفتی. یعنی توی این متد یه ریسمان جدید ساخته بشه و این ریسمان مسئول انجام محاسبات بشه. اینجوری اجرای این متد همینجا تموم میشه و EDT آزاد میشه. حالا توی اون ریسمان هروقت خواستیم دوباره با invokeLater میتونیم به سراغ EDT بریم. این به ذهن من میرسه.

ویرایش:
خیلی وقتا هم میشه از SwingWorker استفاده کرد. این (http://www.javacreed.com/swing-worker-example/) و این (http://www.javaworld.com/article/2073477/swing-gui-programming/customize-swingworker-to-improve-swing-guis.html) رو ببین.