当前位置: 首页 > 知识库问答 >
问题:

Java&Eclipse:我可以同时打印到不同的输出控制台吗?

皇甫飞飙
2023-03-14

我正在使用Windows上的Eclipse IDE(氧气)学习Java(SE8)。我以前做过一些“业余”编程,但这是我第一次正式上这门课。我希望能够在普通控制台(System.out.println)中打印分配所需的输出,并同时在不同的控制台中打印正在发生的信息文本。

printToConsole1(“普通程序输出”);printToConsole2(“幕后信息”);

我可以在Java中做类似的事情吗?

共有1个答案

窦宏旷
2023-03-14

您可以打印到标准err(system.err.println()),我的IDE(不是Eclipse)将以不同的方式格式化这些行--它们以红色显示,使它们更容易定位。

关于Swing控制台,不,我想的是不同的东西。也就是说,只使用Makoto建议的日志框架,然后只使用将日志行显示到窗口的日志处理程序。下面是我创建的一个简短示例。

/**
 * A log handler which creates a visible window for logging output.
 * 
 * <p>A WindowHandler is a standard log handler which may be utilized
 * in just the same was as any other log handler.</p>
 *
 * <p>In addition, a convenience static method is provided, WindowHandler.show(),
 * which will programmatically install a root handler and display a window,
 * allowing debugging output to be easily captured and viewed on screen.</p>
 * 
 * @author Brenden
 */
public class WindowHandler extends java.util.logging.Handler {

   // These static globals must be accessed on the EDT only!
   private static WindowHandler globalHandler;
   private static final ArrayList<WeakReference<WindowHandler>> windowList =
           new ArrayList<>();

   private JTextArea text;
   private JFrame logWindow;

   /**
    * Returns the window component (usually a JFrame) associated with this
    * WindowHandler.
    * 
    * @return The top-level window for this handler.
    */
   public Component getWindow() {
      return logWindow;
   }

   /**
    * Returns the JTextArea associated with the logging output captured by
    * this handler.
    * 
    * @return A JTextArea where logging is displayed. 
    */
   public JTextArea getTextArea() {
      return text;
   }

   /**
    * A list of ALL WindowHandler created so far in the system.
    * 
    * <p>This list is useful for getting a list of windows on screen, for
    * example, and then performing some operation on these windows.  For
    * example, hiding all windows, or closing them, or tiling them on screen
    * for easier viewing.</p>
    * 
    * @return An array list of all current window handlers. 
    */
   public static ArrayList<WindowHandler> getHandlers() {
      ArrayList<WindowHandler> retVal = new ArrayList<>();
      for( WeakReference<WindowHandler> wr : windowList ) {
         WindowHandler h = wr.get();
         if( h != null ) retVal.add( h );
      }
      return retVal;
   }

   /**
    * A convenience method for starting an instance of a WindowHandler.
    * 
    * <p>Call this method at the beginning of your program.  After calling
    * this method, all debugging output will be captured by the 
    * WindowHandler.  Note that individual loggers still have their respective
    * log levels.  WindowHandler is set to Level.ALL by default, but won't
    * receive output from loggers that have their own levels set too high
    * to capture output.</p>
    */
   public static synchronized void show() {
      utilEDTWait( () -> {
         if( globalHandler == null ) {
            Logger root = Logger.getLogger( "" );
            root.addHandler( globalHandler = new WindowHandler() );
         } else {
            globalHandler.getWindow().setVisible( true );
         }
      } );
   }

   /**
    * Creates a new WindowHandler.
    * 
    * <p>This method creates a new handler, sets its level to ALL, and creates
    * the necessary Swing components on the EDT, and displays those components
    * as well.  After creation, this handler may still be configured as normal
    * for any other logging handler.</p>
    */
   public WindowHandler() {
      utilEDTWait( () -> {
         setLevel( Level.ALL );
         JFrame frame = new JFrame( "DEBUG" );
         text = new JTextArea();
         text.setEditable( false );
         text.setPreferredSize( new Dimension( 300, 300 ) );
         JScrollPane scroll = new JScrollPane( text );
         frame.add( scroll );
         frame.setDefaultCloseOperation( JFrame.HIDE_ON_CLOSE );
         frame.pack();
         frame.setLocation( windowList.size()*20, windowList.size()*20 );
         frame.setVisible( true );
         logWindow = frame;
         windowList.add( new WeakReference<>( this ) );
      } );
   }

   @Override
   public void publish( LogRecord record ) {
      SwingUtilities.invokeLater( () -> {
         StringBuilder log = new StringBuilder( text.getText() );
         log.append( record.getMessage() );
         log.append( " -- " );
         log.append( record.getLoggerName() );
         log.append( " : " );
         log.append( record.getLevel() );
         log.append( "  //  " );
         log.append( new Date( record.getMillis() ) );
         log.append( "\n" );
         text.setText( log.toString() );
      } );
   }

   @Override
   public void flush() {
   }

   @Override
   public void close() throws SecurityException {
   }

   private static void utilEDTWait( Runnable r ) {
      if( SwingUtilities.isEventDispatchThread() ) {
         r.run();
      } else {
         try {
            SwingUtilities.invokeAndWait( r );
         } catch( InterruptedException ex ) {
            Thread.currentThread().interrupt();
            throw new RuntimeException( ex );
         } catch( InvocationTargetException ex ) {
            Logger.getLogger( WindowHandler.class.getName() ).log( Level.SEVERE, null, ex );
         }
      }
   }

}
 类似资料:
  • 问题语句:我有一个在Xcode中运行的程序,它有一堆print()语句,可以很好地将输出打印到调试控制台。然而,我希望也能够将这些输出重定向到一个文件,这样我就可以让用户将它们发送给我,作为调试的一种方式。 SO上找到的解决方案使我可以将输出重定向到文件,但调试控制台输出将丢失。 问:我想要我的蛋糕和吃它。我希望能够将print()语句重定向到调试控制台和文件。 所以我有引用:https://st

  • 我在NetBeans IDE中使用Java编写了一个简单的程序。在今天早上对main方法做了一些更改后,当我运行程序时,控制台不会打印任何东西。我只是想让它到达startMenus(sc)。编辑:我现在已经放入了一些system.out.println(),但它没有达到“blah2”,就在我的第一个循环之后...

  • 有没有什么方法可以将控制台输出镜像到java中的localhost,甚至可以添加一些不错的CSS。如果同一网络中的其他设备也能到达控制台,那就太酷了。我做了很多关于这个主题的研究,但没有找到任何关于这个的网站/线程/问题。帮助将不胜感激!

  • 我花了将近3天的时间来找出为什么在一个大项目中 显示为“?”在另一个从头开始建造的项目中,它显示为“你好". 我正在使用IntellijIdea,但在使用 这两个项目之间唯一的两个区别是在构建系统中:第一个使用gradle,第二个不使用(只是一个简单的项目)。第二个区别是关于以下代码的输出 第一个输入“Charset.defaultCharset=windows-1252”,第二个输入“Chars

  • 我已经升级了eclipse,现在控制台输出中的字符混杂在一起。它似乎不会随着输出的出现或滚动的移动而刷新。如何解决这个问题?什么也做不到,如果我移动鼠标,可能屏幕的某些部分会重新绘制,否则它们不会 Eclipse IDE for Java Developers版本:2019-06(4.12.0)构建id:20190614-1200 OS:Mac OS X,v.10.12.6,x86_64/coco

  • 问题内容: 我的C程序粘贴在下面。在bash中,程序打印“ char is”,不打印Ω。我的语言环境均为en_US.utf8。 问题答案: 这很有趣。显然,编译器将omega从UTF-8转换为UNICODE,但libc某种程度上将其弄乱了。 首先:-format说明符期望一个(即使在wprintf -version 中也是如此),因此您必须指定(并因此指定字符串)。 其次,如果您像这样将语言环境设