View Full Version : thread و UI
ayub_coder
پنج شنبه 13 بهمن 1390, 21:42 عصر
سلام دوستان
من یک فرم دارم. دوتا label و یک button
یک برنامه با thread می خوام که خیلی ساده باشه و با کلیک روی باتن هم زمان شروع به شمارش کنه و مقادیر این دوتا label همزمان اضافه بشه
راهنمایی می کنید؟
ayub_coder
جمعه 14 بهمن 1390, 22:28 عصر
یعنی اینقدر کار سختیه؟ مهندسان جاوا لطفا؟
spiderman200700
جمعه 14 بهمن 1390, 23:21 عصر
سلام.
کل برنامه ای رو که خواستی واست نوشتم.
خوبه مهندس؟:متفکر:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class TestThread extends JFrame {
private JLabel lab1 = null;
private JLabel lab2 = null;
private JButton bt = null;
@SuppressWarnings("ResultOfObjectAllocationIgnored")
public TestThread() {
super("Counter");
setSize(200, 120);
setLayout(new FlowLayout(FlowLayout.CENTER));
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
lab1 = new JLabel("0");
lab1.setFont(new Font("tahoma", 1, 25));
lab1.setPreferredSize(new Dimension(180, 25));
add(lab1);
lab2 = new JLabel("0");
lab2.setFont(new Font("tahoma", 1, 25));
lab2.setPreferredSize(new Dimension(180, 25));
add(lab2);
bt = new JButton("Start");
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new RunThread(lab1);
new RunThread(lab2);
}
});
add(bt);
setVisible(true);
}
@SuppressWarnings("ResultOfObjectAllocationIgnored")
public static void main(String args[]) {
new TestThread();
}
}
class RunThread implements Runnable {
private JLabel lab = null;
private Thread tr = null;
private long counter = 0;
@SuppressWarnings("CallToThreadStartDuringObjectConstruction")
public RunThread(JLabel l) {
lab = l;
tr = new Thread(this);
tr.start();
}
@Override
@SuppressWarnings({"static-access", "CallToThreadDumpStack"})
public void run() {
while (true) {
try {
lab.setText(String.valueOf(counter++));
tr.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
ayub_coder
جمعه 14 بهمن 1390, 23:27 عصر
تشکر آقای اسپایدر.در کل قصدم یادگیری بود میشه توضیح بدی که چکار کردی؟
ayub_coder
جمعه 14 بهمن 1390, 23:38 عصر
من این کد رو دارم
Runnable BasicThread1 =new Runnable() {
// This method is called when the thread runs
public void run() {
long i=0;
while(true)
{
i++;
System.out.println(String.valueOf(i));
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
};
یه دکمه گذاشتم رو فرم و تو رویداد کلیکش نوشم
BasicThread1.run();
موقعی که اجرا می کنم و کلیک شروع به شمارش می کنه ولی برنامه هنگه . چرا؟
spiderman200700
شنبه 15 بهمن 1390, 12:45 عصر
مشکل کد شما اینه که از Runnable شی ساختی.اگه شی بسازی باید Thread هم بسازی . اگه بدون ساختن Thread ، از Runnable شی بسازی، وقتی میخوای توی رویداد کلیک button کار شمارش رو شروع کنی، چون برنامه همش توی حلقه ی داخل متد run گیر میکنه، و تا وقتی که اجرای متد run تموم نشه، صفحه نوسازی نمیشه، برنامه هنگ میکنه.
برای اینکه برنامه هنگ نکنه، باید Runnable رو پیاده سازی کنی. اینجوری:
public class myclass extends Frame implements Runnable {
Thread t=new Thread(this);
public myclass() {
//your code
}
@Override
public void run() {
long i = 0;
while (true) {
i++;
System.out.println(String.valueOf(i));
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
بعد باید Thread رو توی رویداد کلیک start کنی.اینجوری:
t.start();
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.