当我运行机器人时,JFrame会冻结

时间:2014-09-24 15:27:00

标签: java

这是一个垃圾邮件机器人它会写一个你按下按钮时输入的字符串,但当我按下运行按钮时,JFrame冻结,我无法按下它来停止它并继续运行。我希望能够在运行时切换按钮,有什么建议吗?

    import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.SwingWorker;
import javax.swing.UIManager;

public class Main extends JFrame{

    private static final long serialVersionUID = 1L;

    JFrame frame = new JFrame("SPAM BOT");
    JTextField txt = new JTextField(20);
    JToggleButton btn = new JToggleButton("START");

    Font font = new Font("Calibri", Font.PLAIN, 20);
    Font font2 = new Font("Wildcard", Font.BOLD, 20);

    public Main(){
        sendUI();
    }

    public void sendUI(){
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());
        frame.setSize(375, 115);
        frame.setVisible(true);

        frame.add(txt);
        frame.add(btn);

        txt.setFont(font);              
        btn.setFont(font2);

        btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {            

                String str = txt.getText().toString();                                                              
                if(btn.isSelected()){
                    btn.setText("STOP");       
                    write(true, str);
                    btn.setSelected(false);

                }else{                      
                    btn.setText("START");
                    write(false, str);
                }

            }
        });

    }

    public void write(boolean typing, final String str){
        while(typing==true){
            SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>(){

                @Override
                protected Void doInBackground() throws Exception {
                    try {
                        Bot bot = new Bot();
                        //bot.type(str + " ");
                        System.out.println("done");
                        Thread.sleep(1000);
                    }catch (AWTException e) {}
                    return null;
                }
            };
            worker.execute();
        }
    }

    public static void main(String args[]){

        try{
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch(Exception e){}

        Main mo = new Main();
    }


}

2 个答案:

答案 0 :(得分:0)

多数民众赞成因为一切都在一个线程中运行。你应该考虑为你的机器人创建另一个线程:)

答案 1 :(得分:0)

通常,诸如此类的流程或与网络相关的任何内容都应在单独的线程上运行,以防止“冻结”。我喜欢在使用Java Swing创建响应式界面时将所有计算保存在单独的线程上。

This Oracle Trail is right down your ally.它提供了一个关于提供响应式GUI的整个部分,包括后台任务和线程池。阅读它肯定会解决你的问题。