2014-01-05 8 views
1

Я позаимствовал проект, который я нашел в stackoverflow, чтобы перенаправить вывод консоли в графический интерфейс. Он работал нормально, пока я не начал читать текстовые файлы в своей программе. Теперь, когда я запускаю программу с помощью графического интерфейса, вывод не выводится, и графический интерфейс зависает, а затем закрывается сам по себе. Вот похудела версия моего GUI код:Перенаправление вывода консоли в GUI

public class GreenhouseControlsGUI { 
    public static class MyGui extends JFrame implements ActionListener { 

     // Start button 
     JButton Start = new JButton("Start"); 

     /..................................../ 

     /** 
     * The constructor. 
     */ 
    public MyGui(){  
     super("Greenhouse Controls"); 

      /............................../ 

     bottomPanel.setLayout(new FlowLayout()); 
     bottomPanel.add(Start); 

      /............................../ 

     getContentPane().add(holdAll, BorderLayout.CENTER); 

     Start.addActionListener(this); 

      /............................../ 

     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 

    public void actionPerformed(ActionEvent e){ 

     if (e.getSource() == Start) 
      GreenhouseControls.startMeUp(); // Start program... 

      /............................../ 
     } 

    public static void main(String[] args){ 

     MyGui myApplication = new MyGui(); 

     // redirect output to GUI 
     myApplication.redirectSystemStreams(); 

     // Specify where will it appear on the screen: 
     myApplication.setLocation(10, 10); 
     myApplication.setSize(500, 300); 

     // Show it! 
     myApplication.setVisible(true); 
     } 

     private void updateTextArea(final String text) { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
       myText.append(text); 
       } 
      }); 
      } 

     private void redirectSystemStreams() { 

      OutputStream out = new OutputStream() { 

       @Override 
       public void write(int b) throws IOException { 
       updateTextArea(String.valueOf((char) b)); 
       } 

       @Override 
       public void write(byte[] b, int off, int len) throws IOException { 
       updateTextArea(new String(b, off, len)); 
       } 

       @Override 
       public void write(byte[] b) throws IOException { 
       write(b, 0, b.length); 
       } 
      }; 

      System.setOut(new PrintStream(out, true)); 
      System.setErr(new PrintStream(out, true)); 
      } 
    } 
} 

Я уверен, что моя проблема начинается с чтения из «имя файла» путь в коде ниже, потому что у меня нет этой проблемы, когда я свой комментарий Выражение переменной 'filename'. Я думал, что методы перенаправления консольного вывода в мой графический интерфейс были только перенаправлением вывода ... Почему все это забивает, когда я читаю из файла? Я новичок в программировании, и я, вероятно, не заметил ничего очевидного, но я не могу понять.

Вот статический метод startMeUp() вызывается внутри класса GUI:

public static void startMeUp() { 
     try { 
      String option = "-f";     // (-f) to start program or (-d) to restore program 
      filename = "src/greenhouse/examples3.txt"; // read file from here 
      dumpFile = "dump.out";      // restore program from here 

      // if option is invalid invoke corresponding print statement 
      if (!(option.equals("-f")) && !(option.equals("-d"))) { 
       System.out.println("Invalid option"); 
       printUsage(); 
      } 

      GreenhouseControls gc = new GreenhouseControls(); // Create GreenhouseControls object 
      Restart restart = new Restart(0,filename, gc); // Create Restart object 
      Restore restore = new Restore(0,dumpFile);  // Create Restore object 

      // if the option value is -f ... 
      if (option.equals("-f")) { 
       gc.addEvent(restart);  // add new Restart object to addEvent() 
      } 
      gc.run();         

      // if the option value is -d ... 
      if (option.equals("-d")) { 
       gc.addEvent(restore);  // add new Restore object to addEvent() 
      } 
      gc.run(); 

      }catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println("Invalid number of parameters"); 
      printUsage(); 
     } 
    } 
+0

моей доброте какая ужасная идея, перенаправляя STDERR. Конечно, это затруднит отладку этой проблемы. Выделите строку 'System.setErr (новый PrintStream (out, true)) и повторите попытку. Вы видите что-нибудь в окне консоли/терминала? –

+0

Пробовал ваше предложение, и у меня все еще такая же проблема. Нет вывода на графический интерфейс пользователя – LooMeenin

+0

о том, что на * консоли * или * окне терминала *? Я не говорю о графическом интерфейсе. У вас есть открытая консоль или терминал? –

ответ

4

Вам нужно вызвать startMeUp в новом потоке, потому что ваша консольная программа блокирует отправки потока событий. Как это:

new Thread() { 
    @Override public void run() { 
    GreenhouseControls.startMeUp(); 
    } 
}.start(); 

вместо просто

GreenhouseControls.startMeUp(); 
+2

Лично я бы рекомендовал SwingWorker над потоком, так как он имеет функциональность, помогающую повторно синхронизировать обновления с EDT – MadProgrammer

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