Java 线程运行时为什么JButton不工作?
我的应用程序中有两个按钮。当按下“开始”按钮时,我创建了一个线程来更新JTextArea。当按下“停止”按钮时,我想停止线程。但当按下“开始”时,“停止”直到线程完成才起作用。有人能帮我吗Java 线程运行时为什么JButton不工作?,java,swing,Java,Swing,我的应用程序中有两个按钮。当按下“开始”按钮时,我创建了一个线程来更新JTextArea。当按下“停止”按钮时,我想停止线程。但当按下“开始”时,“停止”直到线程完成才起作用。有人能帮我吗 public class JTextAreaDemo implements ActionListener { JFrame frame; JPanel jp; JTextArea jta; JButton jb1, jb2; volatile boolean stop
public class JTextAreaDemo implements ActionListener {
JFrame frame;
JPanel jp;
JTextArea jta;
JButton jb1, jb2;
volatile boolean stop = true;
void init() {
frame=new JFrame("Test");
jp=new JPanel();
jta=new JTextArea(7,30);
jb1 = new JButton("Start");
jb1.addActionListener(this);
jb2 = new JButton("Stop");
jb2.addActionListener(this);
jta.setEditable(false);
jta.setLineWrap(true);
jta.setWrapStyleWord(true);
JScrollPane jsp=new JScrollPane(jta);
Dimension size=jta.getPreferredSize();
jsp.setBounds(110,90,size.width,size.height);
jp.add(jsp);
jp.add(jb1);
jp.add(jb2);
frame.add(jp);
frame.setSize(400,200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] agrs){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTextAreaDemo().init();
}
});
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jb1) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0; i<100000 && stop; ++i) {
final String str = "hello:"+i+"\n";
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jta.append(str);
jta.setCaretPosition(jta.getDocument().getLength());
});
}
}
}).start();
System.out.println("begin");
} else if (e.getSource() == jb2) {
System.out.println("stop");
stop = false;
}
}
}
公共类JTextAreaDemo实现ActionListener{
JFrame框架;
JPanel jp,;
jta区;
按钮jb1,jb2;
volatile boolean stop=true;
void init(){
框架=新的JFrame(“测试”);
jp=新的JPanel();
jta=新的JTextArea(7,30);
jb1=新的JButton(“开始”);
jb1.addActionListener(这个);
jb2=新的JButton(“停止”);
jb2.addActionListener(这个);
jta.setEditable(假);
jta.setLineWrap(真);
jta.setWrapStyleWord(真);
JScrollPane jsp=新的JScrollPane(jta);
维度大小=jta.getPreferredSize();
setBounds(110,90,size.width,size.height);
jp.add(jsp);
jp.add(jb1);
jp.add(jb2);
帧。添加(jp);
框架。设置尺寸(400200);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
公共静态void main(字符串[]agrs){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
新的JTextAreaDemo().init();
}
});
}
@凌驾
已执行的公共无效操作(操作事件e){
如果(如getSource()==jb1){
新线程(newrunnable()){
@凌驾
公开募捐{
//TODO自动生成的方法存根
for(int i=0;i这是因为SwingUtilities.invokeLater
将一个操作放在队列上以供以后执行。您的循环for(int i=0;i这是因为SwingUtilities.invokeLater
将一个操作放在队列上以供以后执行。您的循环for(int i=0;i>