View Full Version : مبتدی: عملیاتی کردن یه زیر منو در جاوا
maryshayegh
دوشنبه 31 خرداد 1389, 12:18 عصر
سلام . لطفا یه نگاهی به این برنامه ی ساده بندازین.
برنامه ی زیر یه منوی ساده است شامل منوی Color و زیر منوهای
Red & Green &Blue & Reverse text که با کلیک روی زیر منوی مثلا Red باید رنگ پس زمینه قرمز شود ولی نمیدونم چرا نمیشه و یه چیزیش مشکل داره احتمال میدم مربوط به action mothod اش باشه. هیچ کدوم از زیرمنوها جواب نمیدن !
import java.awt.*;
import java.awt.Graphics;
public class GUI extends java.applet.Applet{
Frame window;
public void init(){
add(new Button("Open"));
add(new Button("Close"));
window=new MyFrame("A popup window");
window.resize(400,400);
}
public boolean action(Event evt,Object arg){
String label=(String)arg;
if(evt.target instanceof Button){
if(label.equals("Open")){
window.show();
}
else if(label.equals("Close")){
window.hide();
}
return true;
}
else return false;
//***********************************
if(evt.target instanceof MenuItem){
if(label.equals("Red"))
setBackground(Color.red);
if(label.equals("Green"))
setBackground(Color.green);
if(label.equals("Blue"))
setBackground(Color.blue);
return true;
}
else return false;
//*************************************
if(evt.target instanceof CheckboxMenuItem){
if(getForeground==Color.white)
setForeground(Color.black);
else
setForeground(Color.white);
return true;
}
else return false;
}
//******************************************
class MyFrame extends Frame{
MyFrame(String title){
super(title);
setLayout(new GridLayout(1,1));
MenuBar mb=new MenuBar();
setMenuBar(mb);
Menu m=new Menu("Color");
m.add(new MenuItem("Red"));
m.add(new MenuItem("Green"));
m.add(new MenuItem("Blue"));
m.add(new MenuItem("-"));
m.add(new CheckboxMenuItem("Reverse text"));
mb.add(m);
}
}
}
jlover
دوشنبه 31 خرداد 1389, 14:51 عصر
این برنامه اصلاً اجرا نمیشه!
شما اول خطاهای کامپایلری رو برطرف کنید، بعد کدتون رو به خلاصه ترین شکل ممکن در بیارید: هر چه که به مشکلتون ارتباطی نداره رو از برنامه حذف کنید؛ و مثلن قرار دادن تنها یک دکمه در برنامه کافیه تا این مشکل خودش رو نشون بده)
اونوقت بهتر و سریعتر میشه کمکتون کرد؛
در ضمن باید خدمتتون عرض کنم که از متد actionPerformed استفاده بفرمایید (به جای action) و مسئله ی مهم:
برای هر مولفه [Component] ی که مایلید عملیاتی بشه، باید یک شنودگر مرتبط با اون عملیات رو براش ثبت کنید تا زمانیکه عملیات مربوطه روی مولفه رخ داد، متد مربوطه فراخوانی بشه
یک مثال ساده:
import javax.swing.JApplet;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
/**
*
* @author Esmaeil Ashrafi <s.ashrafi@gmail.com>
*/
public class SimpleApplet extends JApplet implements ActionListener{
JButton redButton, blueButton;
java.awt.Container container;
public void init() {
redButton = new JButton("set background red");
blueButton = new JButton("set backgraound blue");
redButton.addActionListener(this);
blueButton.addActionListener(this);
container = this.getContentPane();
container.setLayout(new FlowLayout());
container.add(blueButton);
container.add(redButton);
setSize(400, 80); }
public void actionPerformed(ActionEvent e) {
if (e.getSource() == redButton) {
container.setBackground(Color.red);
} else {
container.setBackground(Color.blue);
}
}
}
پ.ن: از متدهای منسوخ مثل resize, show, hide,... استفاده نکنید (هر چند مشکلی ایجاد نمیکنه) و همچنین هر جایی که میشه از مولفه های قرینه در کتابخانه ی swing به جای awt استفاده کنید؛ مثلاً JFrame به جای Frame یا JButton به جای Button ووو (مگر اینکه دارید بخشی از یک کتاب رو مطالعه می کنید که در این فصل به مولفه های awt و در فصلهای آتی به swing می پدازه)
برای موفق شدن تو نوشتن برنامه ها حتماً سعی کنید مستندات رو مطالعه کنید و بسته به نیازتون بهترین عنصر رو به کار بگیرید. از مزیت code completion در IDE ها هم حتماً بهره بگیرید.
maryshayegh
دوشنبه 31 خرداد 1389, 17:16 عصر
واقعا از وقتی که گذاشتین ممنونم
ولی متاسفانه من همونطور که میبینین واقعا مبتدی هستم!
طبق فرمایش شما من از ActionPerformed استفاده کردم ولی فکر کنم یه جاهایی میلنگم اتفاقا برای هر کدوم از MenuItem ها هم یه شی ء در نظر گرفتم تا با نامشون سراغشون برم و مثلا رنگ Frame رو تغییر بدم.
راستش نتیجه نگرفتم برنامه ی شما رو هم اجرا گرفتم ولی خب من با اینها که نوشتین آشنایی ندارم ! الان نمیدونم که آیا برای زیر منو هم میتوان ActionPerformed تعریف کرد یا ...
میتونین همین مثالی که زدین رو برای یه زیر منو نشونم بدین ؟ به جای Button .
که مثلا با انتخاب MenuItem ای رنگ Frame رو قرمز کنه.
توی مثال خودتون کلی روی container فکر کردم آخرش نتیجه گرفتم که شاید یه عنصریه مثل Frame !
از محبتتون ممنونم
موفق باشین
jlover
دوشنبه 31 خرداد 1389, 17:49 عصر
...
... من با اینها که نوشتین آشنایی ندارم ! ...
اینهایی که من نوشتم قرینه های awt در swing بودند (مثلاً JButton قرینه ی Button هست و می بینید که اسمش هم چه تفاوتی داره). این مولفه ها (و به طور کل کتابخونه ی swing) جدیدتر بوده و قابلیتهای بیشتری دارند و امکانات بهتری ارایه میدند.
اینها مثل همونهایی هستند که شما استفاده کردید، و البته بهتر هستند
...الان نمیدونم که آیا برای زیر منو هم میتوان ActionPerformed تعریف کرد یا ...
میتونین همین مثالی که زدین رو برای یه زیر منو نشونم بدین ؟ به جای Button .
که مثلا با انتخاب MenuItem ای رنگ Frame رو قرمز کنه.
با یک نگاه کوچیک به مستندات کلاس J)MenuItem) می بینید که این مولفه هم رویدادهای ActionEvent تولید می کنه، بنابراین همون کارهایی که با دکمه انجام دادیم (ثبت شنودگر ActionListener بواسطه ی متد addActionListener و پیاده سازی متد actionPerformed) رو می تونیم برای فقره های منو هم انجام بدیم؛
یکی از راههایی که می تونستین آگاه بشین امتحان کردن این موضوع بود!
توی مثال خودتون کلی روی container فکر کردم آخرش نتیجه گرفتم که شاید یه عنصریه مثل Frame !
در ابتدا بیشتر از اینکه فکر کردن لازم داشته باشه به مطالعه احتیاج داره: مطالعه ی مستندات اون عنصر(کلاس، متد، واسط...)
به طور خلاصه می تونم بگم که برای افزودن دیگر مولفه ها به پنجره های سطح بالای swing (یعنی JFrame، JApplet, JDialog و JWindow ) باید از پنجره ی محتواشون (content pane) استفاده کرد که دیدید به چه طریقی بدست میاد.
یک کانتینر (Container) همونطور که از اسمش پیداست، مولفه ایه برای جای دادن مولفه های دیگه درون خودش.
پ.ن: حتماً به پانوشت قبلی توجه کنید! و مزیت Code Completion مخصوصاً .
نمی دونم از هیچ IDE استفاده می کنید یا نه، چون در اون صورت به راحتی میتونید فهرست متدهای قابل فراخوانی (بکارگیری) روی یک شیء به همراه شرح جزئیات رو با استفاده از این مزیت مشاهده کنید. و اونوقت جواب خیلی از این سوالات رو بدست میارید.
maryshayegh
دوشنبه 31 خرداد 1389, 20:45 عصر
جسارتا شما فرمودین که :
یکی از راههایی که می تونستین آگاه بشین امتحان کردن این موضوع بود!
شرمنده ولی من توی پست قبلی ام عرض کردم که مبتدی هستم وگفتم که
طبق فرمایش شما من از ActionPerformed استفاده کردم ولی فکر کنم یه جاهایی میلنگم اتفاقا برای هر کدوم از MenuItem ها هم یه شی ء در نظر گرفتم تا با نامشون سراغشون برم و مثلا رنگ Frame رو تغییر بدم.
راستش نتیجه نگرفتم
راستش خیلی دنبال یه E-Book گشتم ولی پیدا نکردم!
مطمئن باشین من خیلی دنبالش هستم و حقیقتا از جوابای دندون شکنی که بهم دادین خوشحال شدم .:لبخندساده:
ممنونم انشالله که سربلند و موفق باشین و از شکست هاتون عبرت بگیرین
همچنان پیگیرش هستم تا بالاخره این پروژه ام رو انجام بدم .
جناب مهندس من رفتم و روش کار کردم و الان دوباره برگشتم خواهش میکنم یه نگاه بندازین:
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.*;
import java.awt.Color;
import java.applet.*;
import java.awt.Container;
public class New extends Applet implements ActionListener{
Container container;
Frame win;
Button b;
Button d;
MenuItem mr;
public void init(){
b=new Button("open");
add(b);
b.addActionListener(this);
d=new Button("close");
add(d);
d.addActionListener(this);
mr.addActionListener(this);
win=new MyFrame("A popup window");
win.resize(400,400);
container = this.getContentPane();
container.setLayout(new FlowLayout());
//container.add(b);
//container.add(d);
container.add(mr);
setSize(400, 80);
}
class MyFrame extends Frame{
MyFrame(String title){
super(title);
setLayout(new GridLayout(1,1));
MenuBar mb=new MenuBar();
setMenuBar(mb);
Menu m=new Menu("Color");
mr=new MenuItem("Red");
m.add(mr);
mb.add(m);
}
}
public void actionPerformed(ActionEvent evt)
{
Object obj=evt.getSource();
if(obj==b)
win.show();
else if(obj==d)
win.hide();
else if(obj==mr)
container.setBackground(Color.red);
}
}//end of Applet
:ناراحت:خب .2تا ارور داره ! اگه بیشتر نشه ! ببینین من از ActionListener استفاده کردم از container استفاده کردم برای اینکه Frame رو داخلش بذارم ! نمیدونم منظورتون رو درست فهمیدم یا نه! چون container رو تازه از شما یادگرفتم.
برنامه ی من قراره توی صفحه ی اصلیش 2 تا Button داشته باشه که یکیش Frame رو باز میکنه که داخل اون یک Menu به نام Color وجود داره و این منو یک زیر منو یا MenuItem داره به نام Red که قراره ActionListener رو بهش اضافه کنم و باکلیک روی Red رنگ فریم قرمز بشه !
آیا بدون container کارم راه نمیفته ؟
خواهش میکنم که اگه براتون مقدوره بازم بهم کمک کنین تا راه بیفتم .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.