2015-04-28 25 views
0

如何將日誌重定向到TextArea?我試着更多的日誌信息是這樣的:JavaFx和StreamHandler

@Override 
public void initialize(URL arg0, ResourceBundle arg1) 
{ 
    _Game.setText(getGSTextLog()); 

} 

public void setGSTextLog(String text) 
{ 
    _gstext = text; 
} 

public String getGSTextLog() 
{ 
    return _gstext; 
} 

public void GameSteam() throws UnsupportedEncodingException 
{ 
    Logger logger = Logger.getLogger("test.test"); 
    logger.setUseParentHandlers(false); 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    StreamHandler sh = new StreamHandler(baos, new SimpleFormatter()); 
    sh.setLevel(Level.ALL); 
    logger.addHandler(sh); 

    logger.severe("Console Test"); 

    sh.flush(); 
    int b = 0; 
    if (b == '\r') 
    { 
     return; 
    } 
    if (b == '\n') 
    { 
     final String text = baos.toString("UTF-8"); 
     baos.reset(); 
     Platform.runLater(() -> setGSTextLog(text + "\n")); 
     return; 
    } 
    baos.write(b); 
} 

回答

2

只實現Handler直接:

import java.util.logging.Formatter; 
import java.util.logging.Handler; 
import java.util.logging.LogRecord; 
import java.util.logging.Logger; 
import java.util.logging.SimpleFormatter; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class LogToTextArea extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     Logger logger = Logger.getLogger("test.test"); 
     logger.setUseParentHandlers(false); 


     TextArea log = new TextArea(); 
     log.setEditable(false); 

     Formatter formatter = new SimpleFormatter(); 

     logger.addHandler(new Handler() { 

      @Override 
      public void publish(LogRecord record) { 
       Platform.runLater(() -> log.appendText(formatter.format(record))); 
      } 

      @Override 
      public void flush() {} 

      @Override 
      public void close() {} 
     }); 

     TextField sendToLog = new TextField(); 
     sendToLog.setOnAction(e -> { 
      logger.info(sendToLog.getText()); 
      sendToLog.setText(""); 
     }); 

     BorderPane root = new BorderPane(log, sendToLog, null, null, null); 
     primaryStage.setScene(new Scene(root, 400, 400)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

如果你的心臟真的在使用StreamHandler,有一個問題需要注意的設置是, StreamHandler將其OutputStream包含在OutputStreamWriter中,其增加了緩衝。所以你可能想要確保處理器在每條日誌消息上刷新緩衝區。例如:

import java.io.IOException; 
import java.io.OutputStream; 
import java.util.logging.Formatter; 
import java.util.logging.LogRecord; 
import java.util.logging.Logger; 
import java.util.logging.SimpleFormatter; 
import java.util.logging.StreamHandler; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class LogToTextArea extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     Logger logger = Logger.getLogger("test.test"); 
     logger.setUseParentHandlers(false); 


     TextArea log = new TextArea(); 
     log.setEditable(false); 

     Formatter formatter = new SimpleFormatter(); 

     StreamHandler handler = new StreamHandler(new OutputStream() { 

      @Override 
      public void write(int b) throws IOException { 
       String s = String.valueOf((char)b); 
       log.appendText(s); 
      } 

     }, formatter){ 

      // flush on each publish: 
      @Override 
      public void publish(LogRecord record) { 
       super.publish(record); 
       flush(); 
      } 

     }; 

     logger.addHandler(handler); 

     TextField sendToLog = new TextField(); 
     sendToLog.setOnAction(e -> { 
      logger.info(sendToLog.getText()); 
      sendToLog.setText(""); 
     }); 

     BorderPane root = new BorderPane(log, sendToLog, null, null, null); 
     primaryStage.setScene(new Scene(root, 400, 400)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
}