View Full Version : سوال: فعال بودن event در زمان غیر فعال بودن Button
securelinprog
شنبه 22 اسفند 1388, 11:43 صبح
چرا وفتی تو java یه Button را غیر فعال می کنیم but.setEnabled(false) هنوز event مربوط به آن فعاله؟ یعنی مثلا اگر کاربر روی آن کلیک کند، تابع مربوط به کلیک کردن mouse فراخوانی می شه؟
چطور می توان کاری کرد که در زمانی که دکمه غیر فعاله، event را هم دریافت نکنه؟
jlover
شنبه 22 اسفند 1388, 12:04 عصر
فکر میکنم منظور شما ActionEvent نباشه قطعن.چون دکمه با غیر فعال شدن دیگه قادر به تولید رویدادهای Action نخاهد بود
و شما بنا به نیازتون باید شنودگر مناسب برای مولفه تون انتخاب کنید
کلیک موس حتمن رویدادهای مربوط به خودش رو تولید خاهد کرد و آرگومان ساخته شده رو به متد رسیدگی کننده ای که در برنامه پیاده سازی شده خاهد فرستاد
اگه قطعه کد مورد نظر باشه بهتر میشه نظر داد
securelinprog
شنبه 22 اسفند 1388, 12:58 عصر
کد زیر کد مربوط به دکمه Pause است که وقتی روی آن کلیک شود، متد مربوطه فراخوانی می شود. ولی وقتی آن را هم disable می کنم، باز event مربوط به کلیک موس گرفته می شود.
من می خواهم وقتی غیر فعاله، وقتی روش کلیک می شه اتفاقی نیافته. چگونه این کار را انجام دهم؟
pauseBut = new javax.swing.JButton();
pauseBut.setText("Pause");
pauseBut.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
pauseButMouseClicked(evt);
}
});
jlover
شنبه 22 اسفند 1388, 13:48 عصر
خب راه حل شما که همون استفاده از actionListener هست و پیاده سازی متد actionPerformed هست که در جواب اول هم عرض کردم
حتی میتونید از برنامه ای که در پست زیر قرار دادم هم غیر فعال کردن دکمه رو امتحان کنید !
http://barnamenevis.org/forum/showpost.php?p=928464&postcount=2
در ضمن توی همون برنامه قطعه کد شما رو هم اضافه کردم به عنوان شنودگر موس برای دکمه
button.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
button.setText("mouse clicekd");
}
});
و در کل جالب بود
securelinprog
شنبه 22 اسفند 1388, 14:16 عصر
پس بطور کلی باید بگم که هر کسی که می خواهد از کلیک کردن موس بر روی هر component ای آگاه شود، حالا چه JButton باشه یا JCheckBox, JMenu, JTextFiled یا JList ، باید از ActionEvent استفاده کند و اگر هم MouseEvent در مورد یکی جواب داد- مانند JButton - نباید از آن استفاده کند.
این هم کد صحیح:
pauseBut = new javax.swing.JButton();
pauseBut.setText("Pause");
pauseBut.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
pauseButActionPerformed(evt);
}
});
از راهنمایی شما متشکرم.
jlover
شنبه 22 اسفند 1388, 15:28 عصر
پس بطور کلی باید بگم که هر کسی که می خواهد از کلیک کردن موس بر روی هر component ای آگاه شود، حالا چه JButton باشه یا JCheckBox, JMenu, JTextFiled یا JList ، باید از ActionEvent استفاده کند و اگر هم MouseEvent در مورد یکی جواب داد- مانند JButton - نباید از آن استفاده کند.
[/code]از راهنمایی شما متشکرم.
:لبخندساده:
کاملن بر عکس
شما بنا به نیازتون باید شنودگر مناسب برای مولفه تون انتخاب کنید
از این مثالی که شما آوردید به این نتیجه میرسیم که رویدادهای ماوس همواره شنیده میشند ( البته این کار سیستم عامل هست ) ، بعد اگر در برنامه ، شنودگر مربوطه ای ( مثل MouseAdapter ) برای مولفه ای ( مثل دکمه ) ثبت شده باشه ، این رویداد به متد پیاده سازی شده توسط شنودگر ( مثلن mouseClicekd ) فرستاده میشه
هر کسی که می خواهد از کلیک کردن موس بر روی هر component ای آگاه شود، حالا چه JButton باشه یا JCheckBox, JMenu, JTextFiled یا JList ،
حتمن باید از شنودگر ماوس استفاده کنه
خانواده ی شنودگرهای ماوس حاوی متدهای ارزشمندیه که به رویدادهای مختلفی رسیدگی میکنند ، نظیر وارد شدن ماوس به یک مولفه ( یا محدوده ) و خارج شدن از اون محدوده ( یا مولفه ) ، رویدادهای drag&drop و...
و mouseClicekd هم یکی از این متدهاست که به رویداد کلیک ماوس رسیدگی میکنه ( با این انعطاف پذیری که حتی در صورت چند بار کلیک شدن رسیدگی کنه ! )
هیچ کدوم این رویدادها توسط ActionListener رسیدگی نخاهند شد.
ولی هر کسی که بخاد بنا بر کلیک ( در واقع انتخاب،چرا که با صفحه کلید هم انجام میشه ) کاربر روی مولفه ای ( مثل دکمه ) ، کارهایی انجام بده ، اونوقته که معمولن باید شنودگر Action رو برای مولفه ی مورد نظر ثبت کنه و فعالیت مورد نظر رو در متد actionPerformed پیاده سازی کنه
securelinprog
شنبه 22 اسفند 1388, 15:53 عصر
کاملن بر عکس
...
حتمن باید از شنودگر ماوس استفاده کنه از MouseEvent که نمی توان همه جا استفاده کرد حتی برای رویداد های موس مانند . JMenuItem
شما بنا به نیازتون باید شنودگر مناسب برای مولفه تون انتخاب کنیدشما درست می گویید ولی معمولا چنین نیست.
چون component هایی را که گفتم معمولا وقتی در یک GUI قرار می دهند برایشان مهم نیست که از طریق موس یا صفحه کلید انتخاب شود، پس بهتر است از ActionEvent استفاده کنیم.
هم چنین به برخی دلایل مانند دریافت رویداد حتی زمانی که دکمه غیر فعال است، بهتر است از ActionEvent استفاده کنیم تا MouseEvent - زیرا مطمئن تر است. معمولا برنامه نویس و کاربر انتظار دارد که وقتی یک component را غیر فعال می کنه، شنودگر آن هم غیر فعال شود. زمانی که از MouseEvent استفاده کنیم، این مشکل وجود داره. بنابراین بهتر است از ActionEvent استفاده کنیم زیر کنترلمان روی رویداد ها بهتر خواهد بود.
بنابراین در حالت کلی بهتره از ActionEvent استفاده کنیم.
jlover
شنبه 22 اسفند 1388, 17:03 عصر
از MouseEvent که نمی توان همه جا استفاده کرد حتی برای رویداد های موس مانند . JMenuItem
التبه من همین الان یک شنودگر ماوس در برنامه ای برای یک JMEnuItem ثبت کردم و امتحان کردم دیدم متد mouseEntered به واسطه ی MOUSE_EVENT قابل فراخانی و اجرا هست .
شما هم تو برنامه تون امتحان کنید !
گرچه متدهای mouseClicked و mouseDragged ( برای مثال ) - همونطوری که شما فرمودید -
در مورد این نوع از مولفه در مقابل رویدادهای مربوطه واکنشی نشون نمیدن
و در ادمه دلیلی که براش متصور هستم رو عرض میکنم
شما درست می گویید ولی معمولا چنین نیست.
چون component هایی را که گفتم معمولا وقتی در یک GUI قرار می دهند برایشان مهم نیست که از طریق موس یا صفحه کلید انتخاب شود، پس بهتر است از ActionEvent استفاده کنیم.
هم چنین به برخی دلایل مانند دریافت رویداد حتی زمانی که دکمه غیر فعال است، بهتر است از ActionEvent استفاده کنیم تا MouseEvent - زیرا مطمئن تر است. معمولا برنامه نویس و کاربر انتظار دارد که وقتی یک component را غیر فعال می کنه، شنودگر آن هم غیر فعال شود. زمانی که از MouseEvent استفاده کنیم، این مشکل وجود داره. بنابراین بهتر است از ActionEvent استفاده کنیم زیر کنترلمان روی رویداد ها بهتر خواهد بود.
بنابراین در حالت کلی بهتره از ActionEvent استفاده کنیم.
شاید من - و کاربرم - بخام وقتی که دکمه غیر فعال شد ، با ورود ماوس به محدوده ی نمایش این دکمه ( مولفه ) کاری انجام بشه ، مثلن رنگ اشاره گر ماوس عوض بشه !
به نظر شما برنامه چطور باید متوجه بشه که کاربر ماوس رو به اون ناحیه برده و ماوس داره در اون ناحیه میگرده و حضور داره ؟
جسارتن بنده این تعبیر رو قبول ندارم !
من حتی الان برای یک JTextField شنودگر ماوس ثبت کردم و در مقابل سه رویداد آزمایشش کردم :
MOUSE_CLICKED : متد مربوطه فراخانی و اجرا شد
MOUSE_ENTERED : متد مربوطه فراخانی و اجرا شد
MOUSE_DRAGGED : واکنشی نشون نداد
این تصور اشتباهیه که فکر کنیم کار موس فقط انتخاب کردنه،پس بهتره به دلایلی که شما گفتید ، برای آگاهی از انتخاب شدن یک مولفه از ACTION_EVENT و شنودگر مربوطه ش استفاده کنیم
من فکر میکنم چون ذهنیت شما از رویدادهای ماوس متاسفانه بیشتر به کلیک ( و اون هم تک کلیک ) معطوف شده این پنداشت رو دارید.
ببینید،ما دو مفهوم جداگونه داریم :
* رویداد انتخاب ( ACTION_EVENT ) - که هم بواسطه ی صفحه کلید و هم بواسطه ی کلیک ماوس تولید میشه
* رویداد ماوس ( MOUSE_EVENT ) - که فقط بواسطه ی ماوس تولید میشه و به همین جهت بدون شک تکرار میکنم که برای آگاهی از رویدادهای ماوس باید از شنودگر ماوس استفاده بشه
همونطور که خودتون گفتید
چون component هایی را که گفتم معمولا وقتی در یک GUI قرار می دهند برایشان مهم نیست که از طریق موس یا صفحه کلید انتخاب شود، پس بهتر است از ActionEvent استفاده کنیم.
اینجا بحث بحث رویداد انتخابه ، نه رویداد کلیک موس
اینکه مثلن text field آزمایش ما به کشیده شدن ماوس روی خودش واکنشی نشون نداد ( که من خودم هم نمیدونستم که ممکنه اینطور باشه ! ) رو من فکر میکنم باید در ذات این مولفه جستجو کرد ! فیلد متن و کشیده شدن !!!
اما مثلن ورود ماوس به ناحیه ی نمایش یک مولفه ( مثلن یک دکمه ) میتونه قابل در نظر گرفته شدن باشه
اما خب مثلن باید بدونید که یک فقره ی منو ، در صورت کلیک کاربر روی خودش ، یک ACTION_EVENT تولید میکنه ... نه یک MOUSE_EVENT و اینا رو طراحان زبان معین کردند بنا به ضروریاتی که وجود داشته....
securelinprog
شنبه 22 اسفند 1388, 17:26 عصر
هدف من هم تنها کلیک کردن بوسیله موس بود نه وارد شدن به یک ناحیه یا اتفاقات دیگری که می تواند بوسیله موس ایجاد شود.
هر کسی که می خواهد از کلیک کردن موس بر روی هر component ای آگاه شود، حالا چه JButton باشه یا JCheckBox, JMenu, JTextFiled یا JList ،بله شما درست می گویید. برای وارد شدن موس به یک تاحیه یا مواردی از این دست باید حتما از MouseEvent کرد.
ولی هدف من تنها کلیک کردن موس بود نه چیز دیگر.
دلیل این هم که طراحان زبان برای برخی مولفه ها مانند JMenuItem از MouseEvent در زمان کلیک کردن استفاده نکرده اند نیز می تواند همین باشد. یعنی عملگر انتخاب از نوع AvtionEvent تعریف شده است. حالا کاربر هر جوری می خواهد انتخاب کند.
برای سایر هدف ها طبق گفته شما باید از رویداد مناسب استفاده کرد. ولی اگر هدف تنها انتخاب کردن است(که این جا هدف همین است) بهتر است از ActionEvent استفاده شود.
من حتی الان برای یک JTextField شنودگر ماوس ثبت کردم و در مقابل سه رویداد آزمایشش کردم :
من نمی گویم که MouseClick برای مولفه هایی مثلا JButton و یا TextField کار نمی کند بلکه من می گویم بهتر است برای انتخاب از ActionEvent استفاده شود تا آن مشکلاتی را که در پست های قبلی گفتم مانند غیر فعال بودن و .... پیش نیاید.
jlover
شنبه 22 اسفند 1388, 18:28 عصر
به این مثال نگاه کنید ( کاملن آماده ی اجراست،میتونید امتحانش کنید )
فقط هم از شنودگر ماوس استفاده شده !
import java.awt.FlowLayout;
import javax.swing.*;
public class Clic extends JFrame {
private JButton button;
public Clic() {
button = new JButton("4 click to deactivate !");
this.setLayout(new FlowLayout());
this.getContentPane().add(button);
button.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
button.setText("seems still is activated !");
if (evt.getClickCount() == 4) {
button.setText("mouse deactivated");
button.removeMouseListener(this);
button.setEnabled(false);
}
}
});
}
public static void main(String args[]) {
JFrame frame = new Clic();
frame.setSize(200, 200);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
}
} // ToggleTest
از شنودگر ماوس ، هم به همون صورت که در متد actionPerformed میشه استفاده کرد بهره گرفته و هم به شکل دیگه ای که مختص ماوس هست !
و البته می بینید که دکمه ، بعد از غیر فعال شدن دیگه گوشش به هیچی بدهکار نیست !
منتها خب بله ، گوشش رو خودمون بریدیم :چشمک:
securelinprog
دوشنبه 24 اسفند 1388, 15:16 عصر
باز هم می گویم که بهتر است از ActionEvent استفاده شود مگر این که برای برنامه نویس فرق داشته باشد که انتخاب با صفحه کلید انجام شود یا موس که در اکثر مواقع این گونه نیست و فرقی نمی کند.
من در پست های قبلی ام نگفتم که نمی شود از MouseEvent استفاده کرد بلکه می گویم بهتر است از ActionEvent استفاده شود.
البته در جاهایی مانند JMenuItem مجبوریم از MouseEvent استفاده کنیم.
به هر حال فکر کنم هر دویمان توانستیم به نتیجه مثبتی برسیم؟
الیته از یک تشکر ویژه از شما می کنم به خاطر رعایت ادب و احترام در ارسال هایتان که طرز بیان شما نشان دهنده این بود که شما فرد مودبی هستید.
jlover
دوشنبه 24 اسفند 1388, 16:56 عصر
باز هم می گویم که بهتر است از ActionEvent استفاده شود مگر این که برای برنامه نویس فرق داشته باشد که انتخاب با صفحه کلید انجام شود یا موس که در اکثر مواقع این گونه نیست و فرقی نمی کند.
من در پست های قبلی ام نگفتم که نمی شود از MouseEvent استفاده کرد بلکه می گویم بهتر است از ActionEvent استفاده شود.
البته در جاهایی مانند JMenuItem مجبوریم از MouseEvent استفاده کنیم.
به هر حال فکر کنم هر دویمان توانستیم به نتیجه مثبتی برسیم؟
الیته از یک تشکر ویژه از شما می کنم به خاطر رعایت ادب و احترام در ارسال هایتان که طرز بیان شما نشان دهنده این بود که شما فرد مودبی هستید.
درود دوست عزیز
هر چند هنوز هم قدری با تعبیری که جنابعالی از نحوه ی تصمیم گیری برای اینکه چه زمانی از چه واسط شنودگری استفاده کنیم میفرمایید ، قدری مشکل دارم ( شاید یک تفاوت جزیی با نظر خودم حس میکنم که شاید تنها یک استنباط غلط باشه ! ) ، اما از اونجاییکه گفتنیها گفته شده ترجیح میدم که دیگه ادامه ندم
صد البته برای من این گفتگو مفید بوده ( مخصوصن پستی که شما فرستادید هرجایی نمیشه از واسط شنودگر ماوس استفاده کرد )
جواب شما رو میتونستم در همون پست اول به همون صورتی بدم که در پست قبلم مثال زدم ( چطور گوشی از دکمه رو - که به فعالیتهای ماوس گوش میده - میشه برید ! ) ، اما باز کردن این بحث علاوه بر من به خاننده های دیگه ی مطلب هم میتونه کمک کنه که درک جامعتری از این موضوع داشته باشند
پیروز باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.