我買了多線程多線程顯示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------------------------");
}
請添加代碼'CreerModelJCL();'我用一個新的線程中運行一個循環,打印一些文字,以每秒控制檯取代這個方法調用測試程序它工作正常。所以我懷疑這種方法(我認爲在控制檯中產生了一些輸出)在GUI線程上運行,並且鎖定了GUI的任何更新。 –
@ d.j.brown新增 –