2014-09-17 3 views
0

Im делает простую небольшую программу, которая спамает текстовый файл. Но я застрял в проблеме. Мне нужно запустить цикл 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){}    
    } 
} 

КАДР

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(); 
       } 
      } 
     }); 
    }  
} 

Так как я могу запустить цикл и кадр, в то же время, так что я могу закрыть кадр? Что я делаю неправильно и как я могу это исправить?

ответ

3

Swing - это однопоточная среда, это означает, что все, что блокирует Thread Dispatching Thread, предотвратит обновление пользовательского интерфейса (или ответ на взаимодействие с пользователем).

Для получения более подробной информации см. Concurrency in Swing.

В этом случае вы хотите запустить фоновый поток и запустить в нем цикл «спама».

Также помните, что Swing не является потокобезопасным, это означает, что вы никогда не должны пытаться взаимодействовать или изменять какой-либо компонент пользовательского интерфейса из любого потока вне EDT.

Смежные вопросы