多线程在GUI JFrame中显示java控制台日志

时间:2017-10-10 09:06:05

标签: java multithreading swing

我遇到了多线程

的问题

我创建了一个java类InformationConsole以获取我的java控制台日志,每当我使用System.out.print("...");时该消息将发送到JTextArea,它就像一个与java控制台和我的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);
  }
}

在GUI中没有实时更新的JTextArea,它将在应用程序完成时显示所有日志,我是一个多线程的新手,我找不到原因...

请你给我一些帮助吗?

以下是CreerModelJCL()他只有很多println的控制台

public static void CreerModelJCL(){

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

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

}

1 个答案:

答案 0 :(得分:1)

您应该在新线程上运行方法CreerModelJCL(),而不是事件派发(GUI)线程。实际上,您将锁定事件派发线程,直到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");
    }
});