View Full Version : سوال: نحوه استفاده از ActionListenr ها برای منو ها
Sina.iRoid
یک شنبه 02 آذر 1393, 19:24 عصر
سلام دوستان.
من دارم يه برنامه اي و مي نويسم که اين برنامه شامل يک سري منو هست. خب براي هر آيتمي بايد يکActionListener يي و تعريف کنيم و کاري که قصد انجامش و داريم و بنويسيم.
حالا سوال من اينه که وقتي تعداد دکمه ها يا مثلا همين تعداد آيتم هاي منو زياد ميشه، خب قشنگ نيست که براي هر دکمه يا آيتم يک ActionListener جداگانه تعريف کنيم.
من وقتي که براي اندرويد برنامه مي نوشتم، با استفاده از دستور switch اين کار و انجام مي دادم. يعني آي دي اون دکمه رو مي گرفتم و بر اساس اون آی دی یکی از case های سوئیچ اجرا میشد.
اما الان در جاوا نمی دوم که چطور باید اینکار و انجام بدم. من یه کلاسی دارم به نام MenuHandler که که اینترفیس ActionListener و پیاده سازی کردم و می خوام داخل این کلاس تمام روید داد های منو
رو بنویسم. اما نمی دونم چه طور بنویسم که برای هر آیتم یک اکشن لیسنر تعریف نکنم.
ممنون میشم اگر راهنماییم کنید.
vahid-p
یک شنبه 02 آذر 1393, 20:01 عصر
دقیقا همون کار رو انجام میدید. شما مثلا بنویسید :
MenuHandler handler=new MenuHandler();
بعد به همه دکمه ها همین یه آبجکت رو اد کنید :
button1.addActionListener(handler);
و حالا کافیه یه ویژگی رو برای چک کردن اینکه چه دکمه ای هست داشته باشید. خیلی چیزها میتونه باشه، یکیش مثلا اسم دکمه.
اتفاقا درستش همینه که وقتی از یه جنس component زیاد داری، برای هر کدومشون یه آبجکت تعریف نکنی
Sina.iRoid
یک شنبه 02 آذر 1393, 21:35 عصر
سلام. خب در اینصورت باز هم باید برای هر باتن یه ActionListener در نظر گرفت. مثلا در اندروید اینطوری می نویسم:
@Override
public void onClick(View whichButtonIsClicked) {
switch (whichButtonIsClicked.getId()) {
case R.id.calculateButton:
// Code related to calculate button
int number_1 = Integer.parseInt(firstNoEditText.getText()
.toString());
int number_2 = Integer.parseInt(secondNoEditText.getText()
.toString());
int finalResult = number_1 * number_2;
String finalResultToString = Integer.toString(finalResult);
tv.setText(finalResultToString);
break;
case R.id.clearButton:
// Code related to clear button
firstNoEditText.setText("");
secondNoEditText.setText("");
tv.setText("");
break;
}
}
ببینید فقط یکبار متد onClick و نوشتم. به این شکلی که شما فرمودین باید برای هر دکمه یه بار متد actionPerformed و بنویسم. در این صورت حجم کد الکی زیاد میشه.
محمد فدوی
یک شنبه 02 آذر 1393, 22:07 عصر
برای حل این مشکل میتونید از ActionCommand استفاده کنید:
...
JButton btnExit = new JButton("Exit");
btnExit.setActionCommand("exit-app"); // Same as mnuiExit
btnExit.addActionListener(this);
...
JMenuItem mnuiAbout = new JMenuItem("About...");
mnuiAbout.setActionCommand("about-us");
mnuiAbout.addActionListener(this);
...
JMenuItem mnuiExit = new JMenuItem("Exit");
mnuiExit.setActionCommand("exit-app"); // Same as btnExit
mnuiExit.addActionListener(this);
...
@Override
public void actionPerformed(ActionEvent e) {
switch(e.getActionCommand()) {
case "about-us": // From mnuiAbout
// Show About...
break;
case "exit-app": // From btnExit or mnuiExit
// Exit...
break;
}
}
این تنها راه نیست. ولی با این روش هم به نیت خودت رسیدی هم میتونی تو برنامت کامپوننت هایی داشته باشی که یه نتیجه دارن (مثل اکثر نرم افزارای بزرگ که میبنی) مثلا یه New Document توی نوار ابزار داری و یه New Document توی منوها. با استفاده از ActionCommand میتونی جفتشون رو به یه جا ختم کنی. خوانایی قابل قبولی هم داره برنامت.
[younes]
چهارشنبه 01 بهمن 1393, 02:23 صبح
استفاده ازعبارات لامبدا برای مدیریت رخداد به نظر جالب میاد این طور نیست؟
JMenuItem mnuiExit = new JMenuItem("Exit");
mnuiExit.setOnAction( (event)->{ /* do something */ });
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.