Redirecting System.out to JTextPane

后端 未结 3 1881
小鲜肉
小鲜肉 2020-11-28 14:39

I have a class (shown below) that extends JPanel and contains a JTextPane. I want to redirect System.out and System.err t

3条回答
  •  醉梦人生
    2020-11-28 15:08

    Piped streams always confuse me, which is why my Message Console solution doesn't use them. Anyway here is my attempt at a console using piped streams. A couple of differences:

    a) it uses a JTextArea because a JTextArea is more efficient than a JTextPane for just displaying text. Of course if you intend to add attributes to the text then you need a text pane.

    b) this solution uses Threads. I'm sure I read somewhere that this was necessary to prevent blocking of the output. Anyway it works in my simple test case.

    import java.io.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.text.*;
    
    public class Console implements Runnable
    {
        JTextArea displayPane;
        BufferedReader reader;
    
        private Console(JTextArea displayPane, PipedOutputStream pos)
        {
            this.displayPane = displayPane;
    
            try
            {
                PipedInputStream pis = new PipedInputStream( pos );
                reader = new BufferedReader( new InputStreamReader(pis) );
            }
            catch(IOException e) {}
        }
    
        public void run()
        {
            String line = null;
    
            try
            {
                while ((line = reader.readLine()) != null)
                {
    //              displayPane.replaceSelection( line + "\n" );
                    displayPane.append( line + "\n" );
                    displayPane.setCaretPosition( displayPane.getDocument().getLength() );
                }
    
                System.err.println("im here");
            }
            catch (IOException ioe)
            {
                JOptionPane.showMessageDialog(null,
                    "Error redirecting output : "+ioe.getMessage());
            }
        }
    
        public static void redirectOutput(JTextArea displayPane)
        {
            Console.redirectOut(displayPane);
            Console.redirectErr(displayPane);
        }
    
        public static void redirectOut(JTextArea displayPane)
        {
            PipedOutputStream pos = new PipedOutputStream();
            System.setOut( new PrintStream(pos, true) );
    
            Console console = new Console(displayPane, pos);
            new Thread(console).start();
        }
    
        public static void redirectErr(JTextArea displayPane)
        {
            PipedOutputStream pos = new PipedOutputStream();
            System.setErr( new PrintStream(pos, true) );
    
            Console console = new Console(displayPane, pos);
            new Thread(console).start();
        }
    
        public static void main(String[] args)
        {
            JTextArea textArea = new JTextArea();
            JScrollPane scrollPane = new JScrollPane( textArea );
    
            JFrame frame = new JFrame("Redirect Output");
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frame.getContentPane().add( scrollPane );
            frame.setSize(200, 100);
            frame.setVisible(true);
    
            Console.redirectOutput( textArea );
            final int i = 0;
    
            Timer timer = new Timer(1000, new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println( new java.util.Date().toString() );
                    System.err.println( System.currentTimeMillis() );
                }
            });
            timer.start();
        }
    }
    

提交回复
热议问题