Swing 如何将javax.mail.Session setDebug重定向到jTextArea

Swing 如何将javax.mail.Session setDebug重定向到jTextArea,swing,jakarta-mail,Swing,Jakarta Mail,如何将javax.mail.Session setDebug重定向到jTextArea ByteArrayOutputStream os = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(os); Session mailSession = Session.getDefaultInstance(props, null); logger.info("JAVAMAIL debug mode is ON"); mailSes

如何将javax.mail.Session setDebug重定向到jTextArea

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
Session mailSession = Session.getDefaultInstance(props, null);
logger.info("JAVAMAIL debug mode is ON");
mailSession.setDebug(true);
mailSession.setDebugOut(ps);
logger.info(os);
  • 您可以创建或查找并将其附加到JavaMail使用的
    javax.mail
    记录器命名空间
  • 您可以使用线程和读取调试输出并将其写入textarea
  • 您可以创建一个缓冲输出流,在“自动刷新”期间写入textarea

    public class AreaDebug {
    
        public static void main(String[] args) throws Exception {
            EventQueue.invokeAndWait(new Runnable() {
                @Override
                public void run() {
                    test();
                }
            });
        }
    
        private static void test() {
            assert EventQueue.isDispatchThread() : Thread.currentThread();
            final Session s = Session.getInstance(new Properties());
            JTextArea area = new JTextArea();
            Adaptor out = new Adaptor(area.getDocument());
            s.setDebugOut(new PrintStream(out, true)); //Default encoding?
            s.setDebug(true);
            System.out.println(area.getText());
        }
    
        private static class Adaptor extends ByteArrayOutputStream {
    
            private final Document d;
    
            Adaptor(final Document d) {
                this.d = d;
            }
    
            @Override
            public void flush() throws IOException {
                final String a;
                synchronized (this) {
                    super.flush();
                    a = super.toString(); //Default encoding?
                    super.reset();
                }
    
                Updater u = new Updater(d, a);
                if (EventQueue.isDispatchThread()) {
                    u.run();
                } else {
                    try {
                        EventQueue.invokeAndWait(u);
                    } catch (InterruptedException ex) {
                        Thread.currentThread().interrupt();
                        throw new InterruptedIOException();
                    } catch (InvocationTargetException ex) {
                        throw new IOException(ex);
                    }
                }
            }
        }
    
        private static class Updater implements Runnable {
    
            private final Document d;
            private final String append;
    
            Updater(Document d, String append) {
                this.d = d;
                this.append = append;
            }
    
            @Override
            public void run() {
                try {
                    d.insertString(d.getLength(), append, (AttributeSet) null);
                } catch (BadLocationException ex) {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
        }
    }
    

  • 您可以使用上描述的nice
    CustomOutputStream
    类:


    谢谢,这对我有用。只需添加:
    standardOut=System.out保留标准输出流和
    系统放样(打印流)的参考;系统设置错误(打印流)
    在设置
    mailSession.setDebugOut(ps)后重新分配标准输出流和错误输出流
    
    import java.io.*;
    import java.util.Properties;
    import javax.mail.Session;
    import javax.swing.*;
    
    public class PrintStream2TextArea {
        public static void main(final String[] arguments) {
            new PrintStream2TextArea().launchGui();
        }
    
        private void launchGui() {
            final JFrame frame = new JFrame("Stack Overflow");
            frame.setBounds(100, 100, 800, 600);
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            final JTextArea textArea = new JTextArea(42, 28);
            setupMailSession(new Properties(), textArea);
            frame.getContentPane().add(textArea);
            frame.setVisible(true);
        }
    
        private void setupMailSession(final Properties props, final JTextArea textArea) {
            PrintStream ps = new PrintStream(new CustomOutputStream(textArea));
            Session mailSession = Session.getDefaultInstance(props, null);
            //logger.info("JAVAMAIL debug mode is ON");
            mailSession.setDebug(true);
            mailSession.setDebugOut(ps);
            //logger.info(os);
        }
    
        /**
         * This class extends from OutputStream to redirect output to a JTextArea.
         *
         * @author www.codejava.net
         */
        public static class CustomOutputStream extends OutputStream {
            private JTextArea textArea;
    
            public CustomOutputStream(JTextArea textArea) {
                this.textArea = textArea;
            }
    
            @Override
            public void write(int b) throws IOException {
                // redirects data to the text area
                textArea.append(String.valueOf((char)b));
                // scrolls the text area to the end of data
                textArea.setCaretPosition(textArea.getDocument().getLength());
            }
        }
    }