2017-10-10 69 views
0

我買了多線程多線程顯示Java控制檯登錄GUI的JFrame

我創建了一個Java類InformationConsole讓我的java控制檯日誌,每次一個小問題,當我使用System.out.print("...");消息將發送到JTextArea中,它就像

public class InformationConsole extends OutputStream { 
    private JTextArea textArea; 
    private final StringBuilder sb = new StringBuilder(); 
    private String title; 

    public InformationConsole(final JTextArea textArea, String title) { 
     this.textArea = textArea; 
     this.title = title; 
     sb.append(title + "> "); 
    } 

    @Override 
    public void flush() { 
    } 

    @Override 
    public void close() { 
    } 

    @Override 
    public void write(int b) throws IOException { 

     if (b == '\r') 
     return; 

     if (b == '\n') { 
     final String text = sb.toString() + "\n"; 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       textArea.append(text); 
      } 
     }); 
     sb.setLength(0); 
     sb.append(title + "> "); 
     return; 
     } 
     sb.append((char) b); 
    } 
} 

我用它與我的GUI顯示日誌

public class Lancer{ 
    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      CreerEtAffichierGUI(); 
     } 
     }); 
    } 

    public static void CreerEtAffichierGUI(){ 
    JFrame fenetre = new JFrame(); 
    JTextArea log = new JTextArea(); 
    InformationConsole consoleInfo = new InformationConsole(log, "InfoConsole"); 

    fenetre.setVisible(true); 
    fenetre.setResizable(false); 
    fenetre.setLocationRelativeTo(null); 
    fenetre.setTitle("Modélisation"); 
    fenetre.setBounds(0, 0, 800, 800); 
    fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JButton bouton1 = new JButton("Start"); 
    fenetre.setLayout(new GridLayout(2, 1)); 
    //On ajoute le bouton au content pane de la JFrame 
    fenetre.getContentPane().add(bouton1); 
    fenetre.getContentPane(). add(new JScrollPane(log, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER));System.setOut(new PrintStream(consoleInfo)); 
    bouton1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      CreerModelJCL(); 
      JOptionPane.showMessageDialog(fenetre, "Modelisation JCL Fini"); 
     } 
    }); 
    fenetre.setVisible(true); 
    } 
} 

釷「連接」與Java控制檯和我的JTextArea e JTextArea在GUI中不會實時更新,它會顯示應用程序完成時的所有日誌,我是多線程的新手,我找不到原因...

請給我我有些幫助?

這裏是CreerModelJCL()他只是有很多println與控制檯

public static void CreerModelJCL(){ 

System.out.println("-------- Exporter fichier résultat XMI Fini--------------"); 

System.out.println("------------------------Modelisation JCL FINI------------------------"); 

} 
+0

請添加代碼'CreerModelJCL();'我用一個新的線程中運行一個循環,打印一些文字,以每秒控制檯取代這個方法調用測試程序它工作正常。所以我懷疑這種方法(我認爲在控制檯中產生了一些輸出)在GUI線程上運行,並且鎖定了GUI的任何更新。 –

+0

@ d.j.brown新增 –

回答

1

你應該在一個新的線程,而不是事件分派(GUI)線程運行的方法CreerModelJCL()。實際上,您正在鎖定事件分派線程,直到CreetModelJCL()執行的操作完成。

例如:

bouton1.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       CreerModelJCL(); 
      } 
     }).start(); 
     JOptionPane.showMessageDialog(fenetre, "Modelisation JCL Fini"); 
    } 
}); 
+0

好的,非常感謝你;) –