我正在创建一个简单的小程序来阻止文本文件。 但我坚持一个问题。我需要同时运行while(true)循环和一个帧。我也需要关闭框架。但我已经尝试过线程和东西,但我无法弄清楚它是什么,我即时需要帮助。这就是我所拥有的
主要
public static void main(String[] args) throws IOException {
Frame frame = new Frame();
}
public static void Spam(){
try{
while(true){
String userName = names[ran.nextInt(names.length)]+ran.nextInt(360);
String rawMessage = messages[ran.nextInt(names.length)]+ran.nextInt(360);
String message=userName+": "+rawMessage;
CustomWriter writer = new CustomWriter();
CustomWriter.Write(message);
System.out.println(message);
Thread.sleep(waitTime);
}
}catch(Exception err){}
}
}
FRAME
public class Frame {
String file;
Frame()
{
final JFrame frame = new JFrame("SuperSpammer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,100);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new FlowLayout());
//Now lets get the stuff
JButton bPickFile = new JButton("FILE");
JButton bStart = new JButton("START");
final JTextField tfWaitTime = new JTextField(5);
final JLabel lSpaming = new JLabel("SPAMING");
final JFileChooser fc = new JFileChooser();
frame.add(bPickFile);
frame.add(tfWaitTime);
frame.add(bStart);
frame.setVisible(true);
//ActionListners
bPickFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
int returnVal = fc.showOpenDialog(fc);
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile().toString();
}
}
});
bStart.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(file!=null){
frame.removeAll();
frame.add(lSpaming);
Main.Spam();
}
}
});
}
}
那么我怎样才能同时运行循环和框架以便关闭框架?我做错了什么,我该如何解决?
答案 0 :(得分:3)
Swing是一个单线程环境,这意味着阻止事件调度线程的任何事情都会阻止UI更新(或响应用户交互)。
有关详细信息,请查看Concurrency in Swing。
在这种情况下,您希望启动后台线程并在其中运行“垃圾邮件”循环。
还要记住,Swing不是线程安全的,这意味着你不应该尝试与EDT之外的任何线程进行交互或修改任何UI组件。