这是一个垃圾邮件机器人它会写一个你按下按钮时输入的字符串,但当我按下运行按钮时,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();
}
}
答案 0 :(得分:0)
多数民众赞成因为一切都在一个线程中运行。你应该考虑为你的机器人创建另一个线程:)
答案 1 :(得分:0)
通常,诸如此类的流程或与网络相关的任何内容都应在单独的线程上运行,以防止“冻结”。我喜欢在使用Java Swing创建响应式界面时将所有计算保存在单独的线程上。
This Oracle Trail is right down your ally.它提供了一个关于提供响应式GUI的整个部分,包括后台任务和线程池。阅读它肯定会解决你的问题。