frameの準備

ログ用フレームを表示する

実用的に使えるログ出力用のフレームを作ってみたいと思います。
教えてもらったプログラムなので恐縮ですが、ここで紹介するような形でよく使っています。
クラスファイルを一式紹介します。
最初はmain()です。中身は前に紹介したものと同じですが、無駄なものを省きました。


public class MainTestFrm10 {
	public static void main(String[] args){
		 LogField.getInstance(); 
	}
}

次は、LogField()です。これも前と同じです。


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;
	}
}

最後にLogFrame()です。大幅にリニューアルして複雑になっています。


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

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


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);

		    contentPane.setMaximumSize(new Dimension(400, 2000000000));
		    contentPane.setMinimumSize(new Dimension(40, 40));
		    contentPane.setPreferredSize(new Dimension(400, 300));
		    statusBar.setToolTipText("");
		    statusBar.setText(" ");
	//    
		    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);

		  }
	  	  
	  
	  /**
	   *  フレーム終了処理
	   * */
	  protected void processWindowEvent(WindowEvent e) {
	    super.processWindowEvent(e);
	    if (e.getID() == WindowEvent.WINDOW_CLOSING) {

	        System.exit(0);
	      
	    }
	  } 
}



hello

 実行すると右図のようになります。フレーム(枠)だけ作ってみました。

フレームの終了処理などを少し変更

 フレームの終了処理にイベントを追加したりしてみました。LogFrame()の変更箇所は以下のとおりです。


import java.awt.BorderLayout;
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.DefaultStyledDocument;
import javax.swing.text.Style;


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;
	  }
}

hello

 実行すると右図のようになります。終了するときにポップアップするようにしてみました。