Java中的实时消息控制台GUI

Java中的实时消息控制台GUI,java,swing,user-interface,console,jtextarea,Java,Swing,User Interface,Console,Jtextarea,我必须在Java应用程序中插入GUI控制台 我选择了班级来做这件事 在我的应用程序中,我使用以下代码来使用类: logPanel = new JPanel(); JTextArea textArea = new JTextArea (28,90); textArea.setEditable (false); textArea.setFont(new Font("Consolas", Font.PLAIN, 12)); logPanel.add(new JScrol

我必须在Java应用程序中插入GUI控制台

我选择了班级来做这件事

在我的应用程序中,我使用以下代码来使用类:

logPanel = new JPanel();
    JTextArea textArea = new JTextArea (28,90);
    textArea.setEditable (false);
    textArea.setFont(new Font("Consolas", Font.PLAIN, 12));
    logPanel.add(new JScrollPane (
            textArea, 
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED),
        BorderLayout.CENTER);
    MessageConsole mc = new MessageConsole(textArea);
    mc.redirectOut();
    mc.redirectErr(Color.RED, null);
    mc.setMessageLines(999);
不幸的是,这台机器不能按我的要求工作。当应用程序处于“暂停”(等待用户交互)状态时,会显示消息行。我想要的是这些行像通常的控制台一样一行一行出现,因为目前有上千行同时出现

我在MessageConsole类中查找了一些“延迟”,但没有找到

我的问题是如何实时获取我的消息行

多谢各位

我认为MessageConsole类可以检查Swing状态的这种变化

MessageConsole类将把系统输出重定向到textarea(或textpane)。但是,与任何Swing组件类似。您需要使用在事件分派线程(EDT)上执行的代码更新控制台。下面是一个使用Swing定时器在EDT上执行代码的简单示例:

Timer timer = new Timer(1000, new java.awt.event.ActionListener()
{
    public void actionPerformed(java.awt.event.ActionEvent e)
    {
        System.out.println( new java.util.Date().toString() );
    }
});
timer.start();
同时出现了上千行


这意味着您有长时间运行的代码在EDT上执行,因此在整个代码执行完毕之前,GUI无法重新绘制自身。因此,长时间运行的代码需要在单独的线程或SwingWorker中执行。有关更多信息,请阅读上Swing教程的部分。

问题可能在代码的其他地方。您如何处理Swing线程问题?在后台线程中执行后台进程时小心吗?是否仅更改Swing事件线程上Swing组件的状态?这些细节非常重要。要在应用程序的主方法中使用控制台,我调用一个UI类来创建JFrame(UI window=new UI())。其余的代码都在UI类的UI方法中,仅此而已。我认为MessageConsole类可以检查Swing状态的变化。。。因此,不,我在应用程序中没有任何后台进程。