同时运行Frame和loop?

时间:2014-09-17 23:16:31

标签: java swing jfilechooser thread-sleep

我正在创建一个简单的小程序来阻止文本文件。 但我坚持一个问题。我需要同时运行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();
                }
            }
        });
    }       
}

那么我怎样才能同时运行循环和框架以便关闭框架?我做错了什么,我该如何解决?

1 个答案:

答案 0 :(得分:3)

Swing是一个单线程环境,这意味着阻止事件调度线程的任何事情都会阻止UI更新(或响应用户交互)。

有关详细信息,请查看Concurrency in Swing

在这种情况下,您希望启动后台线程并在其中运行“垃圾邮件”循环。

还要记住,Swing不是线程安全的,这意味着你不应该尝试与EDT之外的任何线程进行交互或修改任何UI组件。