frameの準備

ログ出力の文字色を変える

状況により文字の色を変えたい時もあると思います。そこでログ出力の文字色を行毎に変更してみます
main()で出力する文字の色を数字で指定します。


public class MainTestFrm13 {
	public static void main(String[] args){

		 LogField log = LogField.getInstance(); 
 
			log.setTitle("タイトルをやり直す");
			log.setText(1,"テキストエリアに追加するその1");
			log.setText(2,"テキストエリアに追加するその2");
			log.setText(3,"テキストエリアに追加するその3");	
	}
}

次は、LogField()です。main()指定された色数字に応じてカラー設定してLogFrame()に渡します。


 import java.awt.Color;


public class LogField {

	static String title="仮のタイトル";
	private static LogField insta = new LogField();	  // privateがみそ ここにだけnew
	private LogFrame frame;
	  
	private LogField() {	//フレームを作る
		frame = new LogFrame(title);
	}
		
	public static LogField getInstance() {	  // インスタンス取得メソッド ここはpublic
		return insta;
	}

	public void setTitle(String string) {		
		frame.setTitle(string);
	}
 	
	public void setText(int no,String string) {
		switch(no){
		case 1:frame.setText(Color.black,string); break;
		case 2:frame.setText(Color.blue,string); break;
		case 3:frame.setText(Color.red,string); break;
		default: frame.setText(Color.black,string); break;
		}	
	}
}

最後にLogFrame()です。setText()のところを変更しています。


import java.awt.BorderLayout;
 import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.plaf.ComponentUI;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;


public class LogFrame extends JFrame{

	private JPanel contentPane = null;
	private JLabel statusBar = new JLabel();
	private JScrollPane jScrollPane = new JScrollPane();
	private BorderLayout borderLayout1 = new BorderLayout();
	private DefaultStyledDocument doc = new DefaultStyledDocument();

	private JTextPane jTextPane = new JTextPane(doc) {
		public boolean getScrollableTracksViewportWidth() {
			Component parent = this.getParent();
			ComponentUI ui = this.getUI();
			return(ui.getPreferredSize(this).width < parent.getSize().width);
		}
	};
	private Style STYLE = doc.addStyle(null, null);
	  
	
	public LogFrame(String title) {
	    try {
		      finit(title);
		    }
		    catch(Exception e) {
		     
		      e.printStackTrace();
		    }

		    validate();
		    setLocation(100,100);
		    setVisible(true);
		    clear();	
	}
		
	  void clear() {
		    if(jTextPane == null) {          // jTextPaneが作成されていない
		      return;
		    }
		    jTextPane.setText("");
		  
		  }
	
	  private void finit(String title) throws Exception  {
		   
		    contentPane = (JPanel) this.getContentPane();
		    contentPane.setLayout(borderLayout1);
		    this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		    this.setSize(new Dimension(512, 400));
		    this.setTitle(title);
		    this.addComponentListener(new java.awt.event.ComponentAdapter() {
			      public void componentResized(ComponentEvent e) {
			        this_componentResized(e);
			      }
			    });
		    
		    contentPane.setMaximumSize(new Dimension(400, 2000000000));
		    contentPane.setMinimumSize(new Dimension(40, 40));
		    contentPane.setPreferredSize(new Dimension(400, 300));
		    statusBar.setToolTipText("");
		    statusBar.setText(" ");
		    jTextPane.addComponentListener(new java.awt.event.ComponentAdapter() {
		      public void componentResized(ComponentEvent e) {
			        jTextPane_componentResized(e);
			      }
			    });
		    jTextPane.setMaximumSize(new Dimension(400, 2000000000));
		    jTextPane.setEditable(false);
	
		    jScrollPane.setMaximumSize(new Dimension(400, 30000));
		    contentPane.add(statusBar, BorderLayout.SOUTH);
		    contentPane.add(jScrollPane, BorderLayout.CENTER);
		    jScrollPane.getViewport().add(jTextPane, null);

		  }
	  	  
	   /**
	    * フレームのリサイズリスナ
	    **/
	  private void this_componentResized(ComponentEvent e) {
	    if(this.getSize().width > 1280) {
	      this.setSize(new Dimension(1280,this.getSize().height));
	    }
	  }
	  
	  /**
	    * テキストサイズ変更リスナ
	    * 
	    */
	  private void jTextPane_componentResized(ComponentEvent e) {
	  
		  jScrollPane.getVerticalScrollBar().setValue(jTextPane.getHeight());
	   
	  }
	  
	  /**
	   *  フレーム終了処理
	   * */
	  protected void processWindowEvent(WindowEvent e) {
	    super.processWindowEvent(e);
	    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
		      if(ckClose()) {
		    	  System.exit(0);
		      }
	    }
	  } 
	
	  /**
	   * 終了確認
	   */
	  private boolean ckClose() {
	     boolean ret = false;
	    // 確認ダイアログの表示
	    if(JOptionPane.showConfirmDialog(this, "フレーム閉じますよ!",
	                   "MainFrame", JOptionPane.OK_CANCEL_OPTION)
	                   == JOptionPane.YES_OPTION) { // OK
	      ret = true;
	    }
	    return ret;
	  }



/**
 * ログを出力する。
*/
	void setText(Color color, String text) {
		if(doc == null || STYLE == null) {          // doc or STYLEが作成されていない
			System.out.println(text);
			return;
		}
		try {
 			StyleConstants.setForeground(STYLE, color);
			doc.insertString(doc.getLength(), text + System.getProperty("line.separator"), STYLE);
		}
		catch(BadLocationException e) {
			System.out.println(e);
		}
	}
}




hello

 実行すると右図のようになります。文字の色が行毎に変わっています。

ログらしく時間を入れる

 せっかくなのでログらしく時間を表示するように修正します。修正するのはLogField()だけで以下のとおりです。
Dateのインポートは、「import java.util.Date;」です。「java.sql.Date」ではありませんので注意です。


import java.awt.Color;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


public class LogField {

	static String title="仮のタイトル";
	private static LogField insta = new LogField();	  // privateがみそ ここにだけnew
	private LogFrame frame;
	  
	private LogField() {	//フレームを作る
		frame = new LogFrame(title);
	}
		
	public static LogField getInstance() {	  // インスタンス取得メソッド ここはpublic
		return insta;
	}

	public void setTitle(String string) {		
		frame.setTitle(string);
	}
	
	public void setText(int no,String string) {
 		string=getTime() + "  " + string;
		switch(no){
		case 1:frame.setText(Color.black,string); break;
		case 2:frame.setText(Color.blue,string); break;
		case 3:frame.setText(Color.red,string); break;
		default: frame.setText(Color.black,string); break;
		}
	}
 	
	  /**
	   * 時刻を返す
	   * 	   */
	  private String getTime() {
	    DateFormat date = new SimpleDateFormat("HH:mm:ss");
	    return(date.format(new Date()));
	  }
}

hello

 実行すると右図のようになります。時間が表示されて、ログ出力らしくなりました。