بلاخره به جواب رسیدم!
مشکل من این بود که هنوز مفهوم Interface رو دقیق دقیق نفهمیده بودم با اینکه ازش استفاده میکردم و با ActionListener که یک اینترفیس دیگست و مثال دوست عزیز spiderman200700 که new Runnable کرده بودن جرقه ای خورد تا به جواب برسم.
گفتم اگه سوال کس دیگه ای باشه و از اونجا که منابع جاوا به زبان فارسی کمه، شاید اینی که مینویسم یه روزی به درد یکی بخوره!
در اصل Interface ای که Runnable باشه اینجا میاد MyFrame که ساب کلاس JFrame هست رو بتوان به صورت Runnable در کانستراکتور Thread استفاده کرد.
خب کل اینا یعنی چی؟
ما برای ساختن هر Thread میتونیم مستقیما از خود Thread استفاده کنیم یا ساب کلاسی که براش ساختیم. اما چون اینجا MyFrame ساب کلاس JFrame هست پس نمیتونه ساب کلاس Thread هم باشه. پس مستقیما از خودش استفاده میکنیم یا تو یه کلاس دیگه ساب کلاسش درست میکنیم که نیازی نیست.
پس اول کلاس MyFrame رو می نویسیم :
MyFrame.java
package prog;
import javax.swing.JFrame;
public class MyFrame extends JFrame implements Runnable{
int delay;
public MyFrame(int delay)
{
this.delay=delay;
setSize(200,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void run() {
try {
for(int i=0;i<100;i++){
setTitle("Title #"+i);
Thread.sleep(delay);
}
} catch (InterruptedException ex) {
System.err.println(ex);
}
}
}
خب این ساب کلاس JFrame هست پس میتونیم ساختار فریممون رو تو کانستراکتورش بنویسیم. از طرفی چون از اینترفیس Runnable استفاده کردیم و متد run رو باید پیاده سازی کنیم و میشه هر جا تابعی یا کانستراکتوری از Runnable استفاده میکنه اینو جاش بذاریم.
خب کانستراکتور که مثل همیشه، ران هم گفتم هر چند ثانیه که delay مشخص میکنه یه واحد افزایش بده و در Titlebar فریممون بنویسه.
حالا کلاس اصلی.
Main.java
package prog;
public class Main {
public static void main(String[] args) {
MyFrame win1=new MyFrame(1000);
MyFrame win2=new MyFrame(500);
win2.setLocation(300, 0);
Thread t1=new Thread(win1);
Thread t2=new Thread(win2);
t1.start();
t2.start();
}
}
خب اینجا دو فریم ساختیم ( چون خودشون ساب کلاسی از JFrame هستند پس میشه اونا رو به عنوان آبجکت ساخت )
بعد دو تا Thread ساختیم که در کانستاکتورش که به صورت
public Thread(Runnable target)
هست برای آرگومان اولی میایم و همون فریم های قبلی که اسمشون win1 و win2 هست رو قرار میدیم. ( چون از اینترفیس Runnable هست پس میشه قرار داد )
و اون Thread ها رو start میکنیم تا از run پیاده سازی شده و override شده در MyFrame استفاده کنه.
این کد ها رو تو دو فایل به اسمهای MyFrame.java و Main.java و در پکیج prog کپی کنید تا خروجی رو ببینید.