نمایش نتایج 1 تا 8 از 8

نام تاپیک: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

  1. #1

    Question ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    سلام
    من میخام به طور مثال از یک لیبل اکستند کنم و ماوس اونت های اون رو تغییر بدم مثلا اگه روش کلیک شد رنگش عوض شه حالا میخام از این لیبلی که خودم ساختم چنتا دیگه new کنم حالا میخام وقتی روی یکی دیگه از این شی هایی که از این لیبل خودم ساختم کلیک کردم رنگ اون اولیه که با کلیک تغییر کرده بود برگرده مثل قبلش ! آیا راهی هست که تو خود کلاسی که دارم از JLabel اکستند میکنم این رو اجرا کرد که دیگه مجبور نباشم برای همه ی لیبل های ساخته شده تابع ماوس کلیک تعریف کنم که رنگ بقیه رو به حالت اولش برگردونه ؟

  2. #2
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    ایده ای برای اینکار در حال حاضر ندارم. چون اینکه بین آبجکت ها ارتباطی باشه که در تعریف کلاس بشه اون رو اعمال کرد و نیاز نباشه بعد از ایجاد شیء هیچ کاری انجام بدیم، به نظر نمیاد شدنی باشه.
    هر چند ممکنه بشه با ترفندهایی شبیه این رو پیاده کرد ولی دقیقا چیزی که میخواید نه.

    مثلا یکی از راهکارها این هست که کلاسی که لیبل ها رو تعریف میکنید، رو کامل بتونیم به سازنده ( constructor ) کلاس اکستند شدمون بدیم و بعد با هر رخداد بیاد و لیبل های دیگه رو مثلا به حالت اول برگردونه. یا JPanel ای که لیبلها در اون قرار داده رو به کانستراکتور بدیم و بعد تو قسمت هندلر کامپوننت هاش رو یکی یکی تو یک حلقه بگیریم و چک کنیم نوعش اگر هم نوع همین بود مثلا رنگش رو تغییر بده. یا کارهای شبیه به این. ولی بدی این روش این هست وابستگی زیادی بین اشیا ایجاد کردید و عموما چنین چیزی توصیه نمیشه.

    در نتیجه به نظر من بهتره یک هندلر تعریف کنید که لیست لیبل ها رو چک کنه و به همه لیبل ها همین یک شی رو بدید تا شلوغ هم نشه.

  3. #3

    نقل قول: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    نقل قول نوشته شده توسط vahid-p مشاهده تاپیک

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

  4. #4
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    چیز خاصی منظورم نبود. همون هندلر معمولی فقط یکم عمومیت بهش بدی تا هم کد ساده بشه و هم بتونی مثلا هر گروه خواستی اینکار رو انجام بدی.
    مثلا کد زیر هر چند تا JButton که به عنوان آرگومان به سازنده MyHandler بدی در یک گروه قرار میگیرند. چون در کد از JComponent استفاده شده پس فرقی نمیکنه JButton باشه، JLabel باشه یا ... فقط لازمه رخداد کلیک موس رو داشته باشند

    import java.awt.Color;import java.awt.FlowLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.*;


    public class Main2 extends JFrame{
    public Main2(){
    super();
    setSize(500,500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new FlowLayout());

    JButton label1=new JButton("JButton 1");
    JButton label2=new JButton("JButton 2");
    JButton label3=new JButton("JButton 3");
    JButton label4=new JButton("JButton 4");
    JButton label5=new JButton("JButton 5");
    MyHandler mouseHandler=new MyHandler(label1,label2,label3,label4,label5);
    label1.addMouseListener(mouseHandler);
    label2.addMouseListener(mouseHandler);
    label3.addMouseListener(mouseHandler);
    label4.addMouseListener(mouseHandler);
    label5.addMouseListener(mouseHandler);
    add(label1);
    add(label2);
    add(label3);
    add(label4);
    add(label5);
    }

    private class MyHandler extends MouseAdapter{
    JComponent components[];
    public MyHandler(JComponent ... components) {
    this.components=components;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    JComponent targetLabel=(JComponent) e.getSource();
    for(int i=0;i<components.length;i++){
    components[i].setBackground(Color.YELLOW);
    }
    targetLabel.setBackground(Color.red);
    }

    }
    public static void main(String[] args) {
    new Main2().setVisible(true);
    }
    }

  5. #5

    نقل قول: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    نقل قول نوشته شده توسط vahid-p مشاهده تاپیک
    چیز خاصی منظورم نبود. همون هندلر معمولی فقط یکم عمومیت بهش بدی تا هم کد ساده بشه و هم بتونی مثلا هر گروه خواستی اینکار رو انجام بدی.
    مثلا کد زیر هر چند تا JButton که به عنوان آرگومان به سازنده MyHandler بدی در یک گروه قرار میگیرند. چون در کد از JComponent استفاده شده پس فرقی نمیکنه JButton باشه، JLabel باشه یا ... فقط لازمه رخداد کلیک موس رو داشته باشند

    }[/JAVA]
    دمت گرم
    کد کار میکنه ولی نمیدونم چرا روی لیبل اولی که تو پنل هست اجرا نمیشه این فایل رو یه نگاه بنداز یه نمونه درست کردم . وقتی روی شماره 1 کلیک میکنی ارور nullpointer میده ولی برای بقیه کار میکنه هر کاری کردم نتونستم بفهمم مشکلش از کجاست !!
    NewJFrame.zip

  6. #6
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    بهتره به همون صورت که گفتم مینوشتید. اولا نیازی به استفاده از arraylabels نیست. اونم در سازنده کلاس MyHandler. شما در arraylabels که در سازنده MyHandler صدا میزنید و labels در arraylabels تعریف میشه در حالی که قبلش به سازنده MyHandler پاس دادید.
    اون components خودش آرایه ای از label ها هست پس نیازی به چنین تابعی نیست. موقع تعریف در کلاس Main2 بیایید و یک آرایه از کامپوننت ها بگیرید یا همونجا arraylabels رو صدا بزنید یکبار (کاری که شما کردید چندین بار الکی labels ساخته میشه).

    برای همین هم کامپوننت اول چون موقع صدا زدن سازنده MyHandler آرگومان که همون labels هست و در سازنده به اسم components هست مقدار null داره و این مقدار به component2 داده میشه و الی آخر. ولی چون در سازنده اول labels در arraylabels شی اش ساخته میشه در صدا زدن سازنده MyHandler های بعدی این مقدار null نیست.

    برای کدهای آیندتون هم بهتره دیباگ کردن رو یاد بگیرید یا لااقل به اشیائی که مشکوک هستید یا نقاطی که خطا میده با System.out.println آبجکت ها رو پرینت کنید تا متوجه بشید کدوم آبجکت null هست و مشکل رو بتونید پیدا کنید.

  7. #7

    نقل قول: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    این که لیبل ها رو توی یه آرایه گذاشتم برای اینه که تعداد لیبل های پروژه اصلیم نزدیک 45 تاست و این که چندین جا به این لیبل ها نیاز دارم
    دیباگ کردن رو بلدم ولی نمیدونم چرا موقعی که این کد اجرا میشه فقط برای لیبل اول null هست و برای بقیه نیست ! مگه نباید وقتی کلیک میشه این کد ها اجرا بشه و تابع arrayLabel اجرا بشه و lebals پر بشه ؟ حتی این تابع رو توی کانستراکتور هم گذاشتم ولی بازم نول میده ! توی کانستراکتور گذاشتم که موقع شروع برنامه آرایه labels مقدار بگیره ولی اینطوری نمیشه هم بعد تابع initcomponent هم قبلش !!
    البته تونستم خودم مشکل رو حل کنم فقط باید بعد از اینکه لیبل ها new میشن تابع arrayLabel رو فراخوانی میکردم که راهش با swing desiner یکم پیچیده بود که پیداش کردم(البته با اینکار از استفاده ی این تابع برای بقیه مورد ها هم کم شد چون labels مقدار کاملش رو گرفت . فقط چون نمیشه توی خود کلاس اصلی به اینصورت از لیبل ها آرایه درست کرد توی یه تابع مثل arrayLabel نوشتم که بشه راحت تر لیبل هامو به آرایه اضافه کنم ) . چون کدهایی که خودش میسازه رو نمیشه تغییر داد ! باید از توی پروپرتیز بهوشن اضافه کرد . با این حال مشکل حل شده ولی هنوز نمیتونم درک کنم که چرا باید اینطوری بشه ؟! باید موقع کلیک کردن تابع arrayLabels فرخوانی بشه و labels مقدار بگیره ولی برای لیبل اولی اینطوری نمیشه !

  8. #8
    کاربر دائمی آواتار vahid-p
    تاریخ عضویت
    آذر 1391
    محل زندگی
    تهران
    پست
    1,140

    نقل قول: ایجاد کلاس که خود کار رنگ بقیه کلاس های از نوع خودش رو تغییر بده

    علت null بودنش رو توضیح دادم. شما اول سازنده رو با آرگومان labels صدا میزنید (که مقدار null داره) بعد arraylabels اجرا میشه. این labels در components قرار میگیره و components به components2 تخصیص پیدا میکنه.
    تعداد labelهات هر چقدر باشه باز هم نیازی به این کار نیست. نمیگم arraylabels اشتباهه، ترتیب فراخوانی یا مکان فراخوانی اشتباهه. راحتتر میتونید از اول به صورت یک آرایه تعریف کنید (البته سورس نباید قفل باشه)
    به صورتی که شما توضیح دادید، فقط دارید پیچیده اش میکنید و کد بدساختاری خواهد شد که رفته رفته نمیتونید یه قسمتش رو تغییر بدید بدون اینکه بقیه قسمت ها دچار مشکل نشن.

    باید موقع کلیک کردن تابع arrayLabels فرخوانی بشه و labels مقدار بگیره ولی برای لیبل اولی اینطوری نمیشه !
    طبق کدی که دادید موقع new MyHandler این تابع فراخوانی میشه نه موقع کلیک کردن.
    بعد از ساخت محیطتون توسط swing designer باید از شر قفل بودن فایل سورس خلاص بشید چون میخواید به صورتی که دوست دارید سفارشی سازی کنید.

تاپیک های مشابه

  1. آموزش: ایجاد کلاس های مناسب EF Code First از روی Database موجود
    نوشته شده توسط mze666 در بخش دسترسی به داده ها (ADO.Net و LINQ و ...)
    پاسخ: 1
    آخرین پست: سه شنبه 10 آذر 1394, 20:18 عصر
  2. سوال: کدی که خودش رو تغییر بده
    نوشته شده توسط me.enik در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 9
    آخرین پست: پنج شنبه 01 خرداد 1393, 21:16 عصر
  3. سوال: ایجاد نشدن فایل sln در کنار بقیه فایل های برنامه
    نوشته شده توسط veniz2008 در بخش ASP.NET Web Forms
    پاسخ: 4
    آخرین پست: چهارشنبه 14 دی 1390, 16:36 عصر
  4. سوال: مچ کردن کنترل FileUpload با کلاس Thumbhandler از نوع httphandler
    نوشته شده توسط bahareh1368 در بخش ASP.NET Web Forms
    پاسخ: 0
    آخرین پست: یک شنبه 20 آذر 1390, 19:10 عصر
  5. ايجاد كلاس هاي مجازي در سايت
    نوشته شده توسط samira2008 در بخش گفتگو با مسئولین سایت، درخواست و پیشنهاد
    پاسخ: 7
    آخرین پست: سه شنبه 04 آبان 1389, 15:21 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •