gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:09:22 25 4
gpt4 key购买 nike

我在多线程方面遇到了一些问题

我创建了一个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------------------------");

}

最佳答案

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

关于java - 多线程在 GUI JFrame 中显示 java 控制台日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46662729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com