View Full Version : مبتدی: فراخوانی 2 متد ماوس باهم از کلاسی به کلاس دیگر
maryshayegh
جمعه 04 تیر 1389, 00:20 صبح
سلام.شاید عنوان سوالم اشتباه باشه ! لطفا برنامه ام رو نگاه کنین ...
برنامه ی زیر فرمی است که حاوی چند منو است یکی از منوهای آن منوی Graphics است که زیر منوی Line رو داره .
با کلیک بر روی این زیر منو (Line) باید توی یه پنجره ی دیگه خطی توسط رویدادهای ماوس (mouseDrag & mouseDown) بتوان رسم کرد ... ولی نمیتونم !
جاهایی رو که مشکل دارم رو با # مشخص کردم (آخرای برنامه است)
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class DemoMenu extends JFrame implements ActionListener {
private Container cp;
MenuItem quit;
MenuItem new1;
MenuItem open1;
MenuItem oval;
MenuItem rectangle;
MenuItem polygon;
MenuItem line;
DemoMenu (String title) {
setSize(300,300);
setLocation(100,100);
setTitle(title);
final Font font1=new Font("TimeRoman",Font.BOLD,20);
final Font font2=new Font("TimeRoman",Font.ITALIC,20);
final Font font3=new Font("TimeRoman",Font.PLAIN,20);
MenuBar bar = new MenuBar();
Menu menu = new Menu("Font");
Menu menu1 = new Menu("File");
Menu menu2 = new Menu("Graphic");
menu.addActionListener(this);
menu1.addActionListener(this);
menu2.addActionListener(this);
Label l=new Label("This is a Test",Label.CENTER);
add(l);
final CheckboxMenuItem bold=new CheckboxMenuItem("Bold",false);
menu.add(bold);
final CheckboxMenuItem italic =new CheckboxMenuItem("Italic",false);
menu.add(italic);
final CheckboxMenuItem plain =new CheckboxMenuItem("Plain",false);
menu.add(plain);
//*****************************
bold.addItemListener(new ItemListener () {
public void itemStateChanged (ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED)
cp = getContentPane();
cp.setFont(font1);
plain.setState(false);
italic.setState(false);
}});
//****************************
italic.addItemListener(new ItemListener () {
public void itemStateChanged (ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED)
cp = getContentPane();
cp.setFont(font2);
plain.setState(false);
bold.setState(false);
}});
//*****************************
plain.addItemListener(new ItemListener () {
public void itemStateChanged (ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED)
cp = getContentPane();
cp.setFont(font3);
italic.setState(false);
bold.setState(false);
}});
//*****************************
menu2.add(oval=new MenuItem("Oval"));
oval.addActionListener(this);
menu2.add(rectangle=new MenuItem("Rectangle"));
rectangle.addActionListener(this);
menu2.add(polygon=new MenuItem("Polygon"));
polygon.addActionListener(this);
menu2.add(line=new MenuItem("Line"));
line.addActionListener(this);
menu1.add(new1=new MenuItem("New"));
new1.addActionListener(this);
menu1.add(open1=new MenuItem("Open"));
open1.addActionListener(this);
menu.add(quit=new MenuItem("Quit"));
quit.addActionListener(this);
bar.add(menu);
bar.add(menu1);
bar.add(menu2);
setMenuBar(bar);
//*****************************
addWindowListener(new WindowAdapter () {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//*****************************
validate();
pack();
setVisible(true);
}
//*****************************
public void actionPerformed (ActionEvent e) {
System.out.println(e.getActionCommand());
if (e.getSource() == quit)
System.exit(0);
if(e.getSource() ==new1){
DemoMenu2 frame2=new DemoMenu2("New");
frame2.setSize(400,400);
frame2.validate();
frame2.show();
}
if(e.getSource() ==open1){
DemoMenu3 frame3=new DemoMenu3("Open");
frame3.setSize(300,300);
frame3.validate();
frame3.show();
}
if(e.getSource() ==line){
DemoMenu4 frame4=new DemoMenu4();
##frame4.show();
##frame4.mouseDown(Event evt,int x,int y);
##frame4.mouseDrag(line,10,10);
##repaint();
}
}
public final static void main (String[] args) {
new DemoMenu("A frame with a menu bar");
}
}//main end
این هم زیر برنامه ی ماوس که قراره با فراخوانی زیر منوی Line اجرا بشه !
import java.awt.*;
import java.awt.Graphics;
//import java.awt.Color;
import java.awt.Point;
import java.awt.Image;
import java.awt.Event.*;
import javax.swing.JFrame;
public class DemoMenu4 extends JFrame {
Point anchor;
Point currentpoint;
private Container cp2;
//MM(String title2){
//setLayout(new FlowLayout());
//setSize(200,200);
//setLocation(400,400);
// setTitle(title2);
public boolean mouseDown(Event evt,int x,int y){
anchor=new Point(x,y);
return true;
}
public boolean mouseDrag(Event evt,int x,int y){
currentpoint=new Point(x,y);
repaint();
return true;
}
public void paint (Graphics g){
g.drawLine(100,100,currentpoint.x,currentpoint.y);
}
}
اشکال کارم کجاست ؟
ممنونم
jlover
جمعه 04 تیر 1389, 13:28 عصر
اگر کدهاتون رو با قراردادهای استاندارد بنویسید (مثلاً برای مشخص کردن یک خط به جای استفاده از ## در ابتدای یک جمله، می تونید از // در انتهای اون جمله و ارایه ی توضیحات استفاده کنید؛ و بسیاری قواعد ابتدایی دیگه که در هر کتاب مرجعی به اونها اشاره میشه، ولی خب کسی میره کتاب مرجع میگیره که بخاد واقعاً و اصولی یاد بگیره...)
و همچنین تا حد ممکن خلاصه شون کنید (یعنی تا جایی که هر جمله ای که ارتباطی با مشکل پیش اومده و سوالتون نداره، حذف بشه)
اونوقت در یک انجمن اینترنتی بهتر و سریعتر میتونید کمک و راهنمایی بگیرید.
به هر حال می تونید به اینجا (http://barnamenevis.org/forum/showthread.php?t=206293) مراجعه کنید تا یک نمونه برنامه ی مشابه ببینید.
در ضمن مشتاقم بدونم رویداد mouseDown که ازش اسم بردید و در برنامه تون استفاده کردید، اصلاً چی هست؟!
maryshayegh
جمعه 04 تیر 1389, 20:18 عصر
سلام حق با شماست مبتدی ام دیگه چه کنم ! حالا حالا ها باید بدوم !!! :خجالت:
برنامه ام حاوی 2 کلاس است که از کلاس 1(حاوی زیر منوی line) میخوام کلاس 2 (برنامه ی رسم خط توسط رویدادهای ماوس)اجرا بشه
شی ء line یک زیر منو ( menuItem) است که با شرط زیر (اگر کاربر روی line کلیک کرد باید یک پنجره باز شود و بتوان در آن پنجره خطی را با رویدادهای ماوس رسم کرد .
حالا اشکال من اینجاست که چطور برنامه ی رسم خط رو توی این شرط فراخوانی کنم ؟!
میدونم که قطعه برنامه ی زیر اشتباهه ! و نمیدونم آیا باید کلاس رویدادهای ماوس رو فراخوانی کنم ؟ نمیدونم باید چه متدی از کلاس رویدادهای ماوس رو اینجا فراخوانی کنم تا بتونم یه خط رسم کنم
}
if(e.getSource() ==line){
DemoMenu4 frame4=new DemoMenu4();
frame4.show();
frame4.mouseDown(Event evt,int x,int y);
frame4.mouseDrag(line,10,10);
repaint();
}
اینم کلاس رسم خط توسط رویدادهای ماوس
import java.awt.*;
import java.awt.Graphics;
//import java.awt.Color;
import java.awt.Point;
import java.awt.Image;
import java.awt.Event.*;
import javax.swing.JFrame;
public class DemoMenu4 extends JFrame {
Point anchor;
Point currentpoint;
private Container cp2;
public boolean mouseDown(Event evt,int x,int y){
anchor=new Point(x,y);
return true;
}
public boolean mouseDrag(Event evt,int x,int y){
currentpoint=new Point(x,y);
repaint();
return true;
}
public void paint (Graphics g){
g.drawLine(100,100,currentpoint.x,currentpoint.y);
}
در ضمن مشتاقم بدونم رویداد mouseDown که ازش اسم بردید و در برنامه تون استفاده کردید، اصلاً چی هست؟!
این رویداد با فشردن ماوس رخ میدهد . که همراه رویداد mouseDrag میتواند خطی رو رسم کند
jlover
جمعه 04 تیر 1389, 23:05 عصر
آا..ه، بد بود، بدتر هم شد!
الان به نظر شما من می تونم این دو قطعه کد رو اصلاً به کار بگیرم؟ البته خب زیاد هم نمیشه خرده گرفت...اگه کاملش رو بخواید درست متوجه منظورم بشید و خلاصه کردن رو با حذف کردن همه چی اشتباه نگیرید، باید یه سری به Short, Self Contained, Correct (Compilable), Example (http://sscce.org/) بزنید. اصلاً خودم به زودی باید یه چکیده ی فارسی ازش در بیارم بذارم تو سایت (اگه نباشه)
در ضمن، لطفاً اینقدر نگید من مبتدیم، یکبار فرمودید متوجه شدم، بنده هم مبتدیم، ولی به جای کاسه ی چه کنم چه کنم دستم گرفتن مرتب می گردم و می خونم و امتحان می کنم و تمرین می کنم... هر کسی هم که ادعا کنه به جاوا کاملاً مسلط هست، اشتباه می کنه، چون به خاطر ماهیت بازمنبع بودنش، حتی اگه کسی به همه ی زیر و بم یک کتابخونه ی استاندارد و یک بستر خاص وارد باشه، فردا روزی کتابخونه ی جدیدی یک گروهی ارایه میده و تازه از این هم که بگذریم، نمیتونه همه ی کلاسها و عناصر یک کتابخونه رو از دم تا به انتها حفظ باشه. پس چه میکنه:
بعد از اینکه اصول برنامه نویسی، طراحی شیءگرا، نگارش به زبان جاوا رو یاد گرفت و با کتابخونه های بنیادین آشنا شد، حتماً حتماً از مستندات مربوط به اون کتابخونه بهره مند میشه.
من چند تا سوال ازتون پرسیدم تا بتونم راه رو بهتون نشون بدم، اما شما به هیچ کدوم جواب ندادین.
آیا به اون برنامه ای که پیوند دادم نگاه کردید؟
...خطی توسط رویدادهای ماوس (mouseDrag & mouseDown) بتوان رسم کرد ...
...
...و بتوان در آن پنجره خطی را با رویدادهای ماوس رسم کرد ....
...
... و نمیدونم آیا باید کلاس رویدادهای ماوس رو فراخوانی کنم ؟ نمیدونم باید چه متدی از کلاس رویدادهای ماوس رو اینجا فراخوانی کنم تا بتونم یه خط رسم کنم...
اگر نگاه کرده باشید، جدیدترین و مهمترین چیزی که باید دیده باشید شنودگر ماوس هست.
من توی این قطار کدی که در این تاپیک قرار دادید، هیچ واسط شنودگر ماوسی ندیدم که پیاده سازی شده باشه.
اون برنامه به سادگی هر چه تمامتر، نمونه ای از دریافت و بررسی فعالیتهای ماوس رو به نمایش میگذاره. از ایده ی ساده و استاندارد همون برنامه می تونید برای برنامه های خودتون استفاده کنید.
این رویداد با فشردن ماوس رخ میدهد . که همراه رویداد mouseDrag میتواند خطی رو رسم کند
عجب !
میشه بفرمایید از کجا آوردیدش ؟ یا حتی اصلاً اون یکی متد...mouseDrag رو ؟
دوست عزیز، رویداد MOUSE_DRAGGED, MOUSE_PRESSED, MOUSE ENTERED, ....قابل درکه که چی هستند. اما:
در مدل رویدادی جاوا شما به پیاده سازی متدهای شنودگری نیاز دارید که به این رویدادها گوش میده
و اون رویداد (مثلاً رویداد کلیک ماوس (MouseEvent.MOUSE_CLICKED) ) به طور خودکار توسط سیستم پردازش رویدادها، باعث فراخوانی متدی از واسط شنودگر میشه که مربوط به رسیدگی اون رویداد هست.
لازمه ش هم اینه که هم شنودگر ماوس برای مولفه ی مورد نظر (مثلاً یک پنل) ثبت شده باشه، بواسطه ی متد addMouseListener و هم اینکه متدهای این واسط شنودگر، پیاده سازی بشه. و عملیات تعریف شده ی شما در متد مربوطه ست که اجرا خواهد شد. نه اینکه همینجوری بدون پیاده سازی واسط، فقط به استناد پیاده سازی یک متد که نامی شبیه اون کاری که میخواید انجام بشه داره، انتظار داشته باشید که بعله...
علم غیب که نداره ! من هم ندارم و تا زمانیکه اطلاعات درست و دقیقی از مسئله نداشته باشم نمیشه انتظار داشت پاسخ صحیحی داشت
فکر نمیکنم بیشتر از این بتونم کمکی بهتون بکنم
موفق باشید./
admis2010
شنبه 05 تیر 1389, 14:42 عصر
من اين كاري رو كه مي خواي بكني رو تو سي شارپ انجام دادم ولي اونجا mousedrad رو نداره
اگه بخواي بدونه موس درگ بنويسي :
وقتي mouse click مي شه آدرس موس رو يه جا نگه مي داري ، يه booleanرو true مي كني تا بفهمي كه موس كليك شده.
وقتي mouse move مي شه ،boolean اگه true بود اول صفحه رو refresh مي كني بعد يه خط از آدرس قبلي موس و مكانه جديدش مي كشي.
وقتي mouse up شد booleanرو false مي كني.
اگه مي خواهي چند تا خط بكشي يا مختصاته خط هاتو داشته باش يا صفحه رو refresh نكن ،مثلاً رو يه خطه ديگه بكش كه باز مشكل درست مي كنه .
jlover
شنبه 05 تیر 1389, 14:44 عصر
من اين كاري رو كه مي خواي بكني رو تو سي شارپ انجام دادم ولي اونجا mousedrad رو نداره
اگه بخواي بدونه موس درگ بنويسي :
وقتي mouse click مي شه آدرس موس رو يه جا نگه مي داري ، يه booleanرو true مي كني تا بفهمي كه موس كليك شده.
وقتي mouse move مي شه ،boolean اگه true بود اول صفحه رو refresh مي كني بعد يه خط از آدرس قبلي موس و مكانه جديدش مي كشي.
وقتي mouse up شد booleanرو false مي كني.
اگه مي خواهي چند تا خط بكشي يا مختصاته خط هاتو داشته باش يا صفحه رو refresh نكن ،مثلاً رو يه خطه ديگه بكش كه باز مشكل درست مي كنه .
نمی تونم بشمرم که با این روش چند بار لقمه رو باید دور سر گردوند !
admis2010
شنبه 05 تیر 1389, 14:54 عصر
برنامه ات رو نيگا كردم افتضاح بود.
آخه رويداده موس رو اونجوري نمي نويسند.
اول يه panel مي سازي به فرم add مي كني .
بيرون از كلاس مي نويسي :
MouseListener Mouse = new Mouselistener ;
سمت چپ netbeans يه چراغ مياره كه بايد همه abstract هاش رو بياري ، روش كليك كني مياره.(حوصله ندارم بنويسم)
بعد مي نويسي:
panel.addMouseListener(Mouse) ;
syntax هاش رو درست نمي دونم خودت امتحان كن بايد شبيه به همين باشه
admis2010
شنبه 05 تیر 1389, 14:58 عصر
نمی تونم بشمرم که با این روش چند بار لقمه رو باید دور سر گردوند !
من براتون شمردم 6 بار .
اگه شما روش بهتري داريد بگيد ما هم بدونيم .
jlover
شنبه 05 تیر 1389, 15:27 عصر
بيرون از كلاس مي نويسي :
MouseListener Mouse = new Mouselistener ;
هیچ لزومی نداره که حتماً بیرون از کلاس باشه!
...
اگه شما روش بهتري داريد بگيد ما هم بدونيم .
روش استاندارد - استفاده از مدل رویدادی جاوا.
در دو پست قبلتر توضیح دادم به طور خلاصه. شب و روز هم همه جا ازش استفاده میشه.
maryshayegh
شنبه 05 تیر 1389, 17:11 عصر
سلام .از هر دوتون واقعا ممنونم
ببینین دوستان من ، من الان وقت امتحانام هستش ! درس طراحی صفحات وب رو جاوا بهمون یاد دادن اونم خیلی کم و مختصر . و پروژه ای که داریم همینه که توی یه صفحه ی Applet دوتا Button بذارم با کلیک روی یه Button پنجره ای باز بشه که حاوی 3 تا منو است 2 تا منوی Fille , Font رو درست کردم
منوی آخر که توش موندم همینه یه منویی به نام Graphic که زیر منوی Line ,Oval,Rectangle داره که با کلیک روی هر کدوم از اینها باید بتونم یه خط ،دایره ، مستطیل رسم کنم (با رویدادهای ماوس ) که نمیتونم !
راستش رویدادهای ماوس رو که عرض کردم همینها رو به ما یاد دادن ! اگه شما برنامه ی Applet زیر رو اجرا کنین میبینین که رویدادهای ماوس که گفتم واقعا عملی میشن .
وبرنامه ی زیر یک خط رو با فشردن و درگ کردن ماوس رسم میکنه .
و الان من میخوام اگه روی زیر منویی کلیک کردم بتونم یه جایی یه خطی رسم کنم همین !!!!! :عصبانی++:
import java.awt.*;
import java.awt.Graphics;
//import java.awt.Color;
import java.awt.Point;
import java.awt.Image;
import java.awt.Event.*;
public class DemoMenu4 extends java.applet.Applet {
Point anchor;
Point currentpoint;
private Container cp2;
public boolean mouseDown(Event evt,int x,int y){
anchor=new Point(x,y);
return true;
}
public boolean mouseDrag(Event evt,int x,int y){
currentpoint=new Point(x,y);
repaint();
return true;
}
public void paint (Graphics g){
g.drawLine(100,100,currentpoint.x,currentpoint.y);
}
}
jlover
شنبه 05 تیر 1389, 19:24 عصر
...
...
راستش رویدادهای ماوس رو که عرض کردم همینها رو به ما یاد دادن ! اگه شما برنامه ی Applet زیر رو اجرا کنین میبینین که رویدادهای ماوس که گفتم واقعا عملی میشن .
وبرنامه ی زیر یک خط رو با فشردن و درگ کردن ماوس رسم میکنه .
و الان من میخوام اگه روی زیر منویی کلیک کردم بتونم یه جایی یه خطی رسم کنم همین !!!!!
[/C
بله دوست عزیز، شما درست می فرمودید و من هم از بابت این اشتباه عذر میخام.
این برنامه رو اجرا کردم و متدهای پردازش رویداد برای رویدادهای ماوس هم معتبر بودند و همونطور که فرمودین عملی شدند (بگذریم از اینکه NullPointerException هم گرفتم)
واقعیت اینه که هر چند من با یه منبع قدیمی که با توجه به نسخه ی 1.4 آموزش می داد، شروع کردم، اما گویا کلاس/جزوه/منبع شما، از اون هم عتیقه تره و از متدهایی استفاده می کنه که در نسخه ی 1.1 منسوخ شدند.
متدهایی که فرمودید، در کلاس Component تعریف شدند و به Applet به ارث میرسند. من حتی از Applet هم استفاده نمیکنم و همونطور که در یک پست دیگه اشاره کردم، از JApplet که معادل این مولفه در swing هست استفاده می کنم...(اگر بخوام اپلت بنویسم)
برای همین ایده ای درباره ی این متدها نداشتم...
اما گیر شما ظاهراً روی فراخونی این متدها در واکنش به انتخاب یک منو هست. اگر اینطوره:
در متدهای مربوط به ماوس، فراخوانی متد repaint رو شرطی کنید:
if checkBoxMenuItem.isSelected()
repaint();
یک چنین الگوی ساده ای باید کارتون رو راه بندازه. متاسفانه نگاه کردن به کل کدهاتون کار وحشت انگیزیه..پس مجبورم همینطوری فقط توضیح بدم. (و البته با توجه به اینکه شما ظاهراً نمی رسید خودتون رو با یه کتابخونه ی جدید و روند جدید پردازش رویدادها - که هیچ کار سختی هم نیست - وفق بدید)
در ضمن احتیاجی هم به ItemListener ندارید با این الگو
تذکر: از swing و awt در کنار هم بهتره که استفاده نکنید. حالا که اصرار دارید حتماً از کتابخونه ی awt و تمامی متدهای منسوخ اون استفاده کنید، دیگه بیخیال JFrame بشید.
موفق باشید
maryshayegh
شنبه 05 تیر 1389, 22:20 عصر
ممنون که با خونسردی جواب میدین و سوال من رو دنبال میکنین .
راستش انجام دادم و جواب نگرفتم البته قبلا هم repaint() رو فراخوانی کردم و جواب هم نگرفتم !
1) لازمه بگم که منوی من توی Jframe ایجاد شده . و من میخوام از Jframe به متدهایی که در Applet است فراخوانی انجام بدم. توسط یه زیر منو.
(اگر این زیرمنو کلیک شد برو و کلاس Applet که حاوی برنامه ی رسم خط با ماوس است رو اجرا کن)
..... حالا اگه میشه که این اتصال رو برقرار کنم که هیچ اگه نه
2) من اومدم و یه jframe جدید ساختم و کلا برنامه ی ماوس رو در آن نوشتم که از یه Jframe به Jframe دیگه فراخوانی انجام بدم
(یعنی بتونم توی یه پنجره ی جدید خطی رسم کنم )
3) روش دیگه اینکه بتونم اصلا توی همون Jframe ای که حاوی منو و زیر منو است خطی با رویدادهای ماوس رسم کنم .
همه ی این 3 روش رو سعی کردم انجام بدم به طرق مختلف ولی نشد و به همین خاطر دست به دامان مهندسین شدم ...
یاعلی
jlover
دوشنبه 07 تیر 1389, 00:38 صبح
هر کدوم از سه روشی که گفتید، با دنگ و فنگ های خودش انجام پذیر بود (فقط در مورد جای دادن یک قاب درون یک قاب دیگه چندان مطمئن نیستم...)
مخصوصاً سناریوی سوم با الگویی که در اون برنامه ی نمونه که در صفحه ی قبل پیوند داده بودم، انجام میشد (اونجا عملیات ترسیم توی یه پنل که درون قاب [فریم] انجام میشد و متد paintComponent از JPanel بازنگاری میشد، در عین حال میشد متد Paint از JFrame رو بازنگاری کرد)
اما چطوره همون اپلتی که خودتون قرار دادید رو توسعه بدیم و به هدف (که ظاهراً ترسیم به هر شکل ممکن روی هر مولفه ی ممکن هست) برسیم!
میشه اپلت شما رو درون یک قاب (JFrame) قرار داد و با منویی که متعلق به قاب هست عملیات ترسیم (متد paint) رو کنترل کرد
من این کار رو انجام دادم، یه کوچولو هم اپلتتون رو پیرایش کردم. و دو نمونه رسم هم قرار دادم. یقیناً باید بتونید باقیش رو خودتون انجام بدید. بیشتر از این براتون کد نمی نویسم، چون می ترسم قوانین انجمن و همچنین رویه ی خودم رو زیر پا بگذارم (تا اینجاشو هم به این خاطر اومدم که احساس کردم شما چند خط کد خودتون نوشتید)
اما به هر حال اگه قصد دارید به طور اصولی به جاوا بپردازید، حتماً یه فکر اساسی باید بکنید.
import java.awt.*;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Event.*;
import java.applet.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JRadioButtonMenuItem;
public class DrawingApplet extends Applet {
Point anchorPoint = new Point();
Point currentpoint = new Point();
//private Container cp2; *این که استفاده نمیشه*
static JRadioButtonMenuItem drawLineItem, drawRectItem;
@Override
public boolean mouseDown(Event evt, int x, int y) {
anchorPoint = new Point(x, y);
return true;
}
public boolean mouseDrag(Event evt, int x, int y) {
currentpoint = new Point(x, y);
repaint();
return true;
}
public void paint(Graphics g) {
if (drawLineItem.isSelected())
g.drawLine(anchorPoint.x, anchorPoint.y, currentpoint.x, currentpoint.y);
else if (drawRectItem.isSelected())
g.drawRect(anchorPoint.x, anchorPoint.y,
Math.abs(currentpoint.x - anchorPoint.x), Math.abs(currentpoint.y - anchorPoint.y));
}
public static void main(String args[]) {
JFrame frame = new JFrame("یک قاب حاوی اپلت ترسیمات");
Applet applet = new DrawingApplet();
frame.add(applet);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu menu = new JMenu("Menu");
menuBar.add(menu);
JMenu graphicsMenu = new JMenu("Draw");
menu.add(graphicsMenu);
drawLineItem = new JRadioButtonMenuItem("Draw a line");
graphicsMenu.add(drawLineItem);
drawRectItem = new JRadioButtonMenuItem("Draw a rectangle");
graphicsMenu.add(drawRectItem);
ButtonGroup drawingItemsGroup = new ButtonGroup();
drawingItemsGroup.add(drawLineItem);
drawingItemsGroup.add(drawRectItem);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setVisible(true);
frame.setSize(600, 400);
}
}
در مورد کدها اگر توضیحی لازم داشتید بفرمایید تا عرض کنم خدمتتون (البته بعد از اینکه خودتون گشتید و گشتید و گشتید و باز هم احتیاج به توضیح بیشتر داشتید)
admis2010
دوشنبه 07 تیر 1389, 16:57 عصر
اگه ممكنه درباره ي
repaint();
يه توضيحي بدين ممنون مي شم.
jlover
دوشنبه 07 تیر 1389, 18:09 عصر
اگه ممكنه درباره ي
repaint();
يه توضيحي بدين ممنون مي شم.
باعث فراخونی متد paint یا paintComponent در مولفه های سبک وزن و فراخونی متد update در مولفه های سنگین وزن میشه.
سازوکار ترسیم، به طور خودکار، رد هنگام بهنگام سازی مولفه هم اجرا میشه، مثلاض زمانی که اندازه ی پنجره تغییر می کنه یا بیشینه یا کمینه میشه، متد update به طور خودکار فراخانی شده و فراخونی متد paint یا paintComponent هم دنبال میشه.
توضیح
متد paint یا paintComponent در تمامی مولفه های مشتق شده از Component به ارث میرسه و کار ترسیم مولفه رو بر عهده داره. این متد با دسترسی عمومی تعریف شده و قابل بازنگاری هست.
برای ترسیمات دلخواه شما (یا به عبارتی همون نقاشی)، در swing از مولفه های JComponent یا JPanel استفاده میشه. چون می تونند مثل یه بوم نقاشی مورد استفاده قرار بگیرند! (در awt هم مولفه ای با همین نام، یعنی Canvas مورد استفاده قرار میگیره...)
پ.ن: اولین محل برای گرفتن پاسخ این سوالها، مستندات کتابخونه و همینزو برای داشتن نمونه و مثال، The Java tutorials هست.
موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.