PDA

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();