ورود

View Full Version : سوال: چگونه انتقال Event بین دو آبجکت JPanel مجزا در یک JFrame ؟



vahid-p
سه شنبه 03 اردیبهشت 1392, 16:33 عصر
سوالی که دارم امیدوارم بتونم خوب منظورم رو برسونم چون فکر میکنم سوال مهمی باشه که برای نوشتن برنامه ای تر و تمیز هر کسی به اون نیاز داشته باشه.

با این عکس توضیح میدم :
http://upcity.ir/images2/06368290335144418640.jpg

کادر سبز یک JFrame هست که دو آبجکت JPanel با کادر های آبی و قرمز قرار داره. اما مشکل اینجاست که با کلیک بر روی هر یک از Button های JPanel قرمز، event ایجاد شده در خود آبجکت هست و دسترسی به JPanel آبی ندارد. شاید بگویید خب میتوانیم آبجک آبی را به عنوان آرگومان به کلاس JPanel قرمز بدیم. اما این روش جالبی به نظر نمیاد و مشکلاتی رو ایجاد میکنه.
هدف من اینه که تمام Button های آبجک قرمز به همراه JPanel خود به عنوان یک آبجکت باشه که با کلیک بر روی هر Button از طرف آبجکت قرمز یک event به همراه Label باتن منتقل بشه تا حالا JFrame اونو دریافت کنه و هر کاری میخواد بکنه باهاش.
یعنی کلا میخوام بدونم چطور میشه event ها رو انتقال داد.

ممنون میشم راهنمایی کنید. ( یکی از دوستان گفتن از dispatchingEvent() استفاده میکنیم که فکر نمیکنم این درست باشه )

agusta.ada
سه شنبه 03 اردیبهشت 1392, 21:42 عصر
چرا میخوای برای چند تا باتن یه کلاس جدا بسازی تا بخوای این کارو کنی که اونم راههای خیلی بهتری از این چیزهایی که گفتی هست.
میتونی از الگوی MVC استفاده کنی اگه یه سرچ کنی پر از sample های ماشین حساب با این الگو پیدا میکنی.

vahid-p
چهارشنبه 04 اردیبهشت 1392, 00:22 صبح
میشه یکم در مورد MVC توضیح بدید تا ببینم دقیقا اون چیزیه که میخوام یا نه.
ولی اینکه میگید چند تا باتن حرف شما درسته ولی من یه مثال زدم و در حالت کلی شاید نیاز باشه.

کسی میدونه بهترین راه چیه؟

spiderman200700
چهارشنبه 04 اردیبهشت 1392, 10:28 صبح
سلام.
بهترین راه اینه که یه کلاس رو از ActionListener مشتق کنی و همه ی event های مربوط به Button ها رو داخلش Handle کنی. و یه Object از این کلاس ایجاد کنی و برای همه ی Button ها ستش کنی.
البته اگر برای هر Button یه ActionListener هم تعریف کنی ، هیچ اتفاق خاصی نمیفته. چون برنامه ی ماشین حساب دیگه خیلی event نداره که خیلی به سیستم فشار بیاره.
در کل باید برای هر مجموعه از eventهای به هم مرتبط در داخل برنامه، یه کلاس Handler ایجاد کرد(با روشی که در خط اول گفتم).

vahid-p
چهارشنبه 04 اردیبهشت 1392, 14:03 عصر
خب در حالت عادی هم همین کار رو میکنیم. یعنی این :

private class MyActionHandler implements ActionListener{

@Override
public void actionPerformed(ActionEvent e) {

}

}

فکر کنم شما اینو گفتید درسته؟ ولی منظورم یه چیز دیگست. یعنی ما بیاییم یه کامپوننت جدید از مجموعه کامپوننت ها بسازیم که این کامپوننت جدیدی که ساختیم خودش Event و... داشته باشه.

ماشین حساب رو در نظر نگیرید چون خیلی کوچیکه ولی شاید یه وقت بخواهیم یه کامپوننت جدید ( که نه Button باشه نه TextField نه... ) و یه چیز کاملا جدید باشه. اینم شبیه به همونه..

agusta.ada
چهارشنبه 04 اردیبهشت 1392, 21:27 عصر
MVC یک الگوی معماری نرم افزار که نرم افزارو به سه قسمت model, view, controller تقسیم میکنه که هر کدوم وظیفه خودش رو انجام میده مزیت عمدشم اینه که با تغییر یک قسمت قسمتهای دیگه دست نخورده باقی میمونند به صورت خلاصه میشه گفت:
view: وظیفه نمایش اطلاعات و خروجی را داره به عبارتی رابط کاربری میباشد
model: منطق برنامه باید در این قسمت پیاده سازی بشه business logic
controller: وظیفه تعامل view و controller رو داره و میتونه دستورات رو از view بگیره و یا دستورات تغییر view رو صادر کنه

حالا مثلا برای ماشین حساب میاییم یه GUI طراحی میکنیم که میشه view. منطق برنامه که همون ضرب و تقسیم هست رو در کلاس جداگانه ای مینویسیم که نقش model رو داره و برای controller یه (یا اصلا چند تا ،برای همه سه قسمت صادقه) کلاس جدا پیاده سازی میکنیم که event ها رو بگیره و با مشورت با model خروجی تولید شده رو به view بفرسته.منطق کلی این الگو به این صورت هست حالا رابطه این سه قسمت با هم چطوری باشه و کدوم با کدوم باید رابطه داشته باشه و این رابطه چند طرفه میتونه با شه و ... طبق نیاز برنامه میتونه تا حدودی تغییر کنه برای فهمیدن بهتر این الگو و اینکه اصلا چطوری میشه event کلاسهای view رو به controller ارجاع داد و ... میتونی به sample هایی که گفتم یه سری بزنی.

vahid-p
چهارشنبه 04 اردیبهشت 1392, 22:04 عصر
تقریبا به جوابی که میخواستم رسیدم.

اگر این نشد هم باید برم طرف ساخت کامپوننت که بحث های خودش رو داره.

ممنون از راهنمایی همه دوستان.