2011年2月22日火曜日

JavaPrintServiceでページ毎の印刷

先日は、画像を印刷するというのをやってみたのだけど、本日は、
ページ毎に印刷を行うにはどうしたらいいのだろうかとサンプルを参考に書いてみた。

ポイントは、interfaceのPrintableを実装したクラスを作るということ
そして

public int print(Graphics g,PageFormat pf,int pageIndex)

という関数を実装するということでしょうか。

pageIndexを見て、 Printable.NO_SUCH_PAGEを返してあげるまで
印刷が続くという感じでしょう。

というわけで、例によってサンプルプログラム
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jps/spec/appendix_2DPrinterJob.fm.html#997825
を参考にして、

「現在のページ数:」を表示して、四角を印字するというサンプルプログラムです。

途中。プリンタダイアログも出現します。


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.print.PrintService;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.JobName;
import javax.print.attribute.standard.OrientationRequested;

public class Print2DPrinterJob implements Printable {

 public Print2DPrinterJob() {

  PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
  aset.add(OrientationRequested.LANDSCAPE);
  aset.add(new Copies(2));
  aset.add(new JobName("100ページの印刷", null));

  PrinterJob pj = PrinterJob.getPrinterJob();       
  pj.setPrintable(this);
  //プリンタの検索
  PrintService[] services =
   PrinterJob.lookupPrintServices();

  // primoPDFを検索
  int primoIdx=-1;
  for (int i=0;i<services.length;i++){
   if ("PrimoPDF".equals(services[i].getName())){
    primoIdx=i;
   }
  }
  
  if (services.length > 0) {
   System.out.println("選択されたプリンタ: " + services[primoIdx].getName());
   try {
    pj.setPrintService(services[primoIdx]);
    pj.pageDialog(aset);
    if(pj.printDialog(aset)) {
     pj.print(aset);
    }
   } catch (PrinterException pe) { 
    System.err.println(pe);
   }
  }
 }

 public int print(Graphics g,PageFormat pf,int pageIndex) {

  //100ページというのは(Printable.NO_SUCH_PAGE)を返却することで表現する
  if (pageIndex < 100) {
   Graphics2D g2d= (Graphics2D)g;
   g2d.translate(pf.getImageableX(), pf.getImageableY()); 
   g2d.setColor(Color.black);
   g2d.drawString("現在のページ数:"+(pageIndex+1), 250, 250);
   g2d.fillRect(0, 0, 200, 200);
   return Printable.PAGE_EXISTS;         
  } else {
   return Printable.NO_SUCH_PAGE;
  }
 }

 public static void main(String arg[]) {
  new Print2DPrinterJob();
 }
}

2011年2月21日月曜日

JavaPrintServiceで画像の印刷

Javaプログラムによる印刷を実現するためのJavaPrintService
を使ってみた。

最初は、簡単に画像ファイルを印刷するサンプルを実行してみた。

下記のサンプルでは、PrimoPDFを利用して印刷する例になっています。
結構簡単に印刷できました。

参考にしたページはこちら、

http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jps/spec/JPSTOC.fm.html


import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSizeName;


public class PrintPNGFileTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  FileInputStream textstream= null;
  try{
   textstream = new FileInputStream("D:\\white.png");
  } catch (FileNotFoundException ffne) {
  }
  if (textstream == null) {
   return;
  }
  // ドキュメントの形式を設定。これはpngファイルの場合
  DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
  PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        //用紙のサイズを指定。
  aset.add(MediaSizeName.ISO_A4);
  aset.add(new Copies(2));
  PrintService[] services =
   PrintServiceLookup.lookupPrintServices(
     flavor,
     aset);  
  System.out.println("プリンタ件数:"+services.length);
  for (int i=0;i<services.length;i++){
   System.out.println(services[i].getName());
  }
  int primoIdx=-1;
  for (int i=0;i<services.length;i++){
   if ("PrimoPDF".equals(services[i].getName())){
    primoIdx=i;
   }
  }
  if (services.length > 0) {
   Doc myDoc = new SimpleDoc(textstream, flavor, null);
   DocPrintJob job = services[primoIdx].createPrintJob();
   try {
    job.print(myDoc, aset);
   } catch (PrintException pe) {
    pe.printStackTrace();
   }
  }
 }

}

2011年2月19日土曜日

GWTでファイルダウンロードのメモ

GWTでファイルのダウンロードロジックを書く場合ってどうやるもんだろうか
といろいろ調べていた時にたどり着いたページが下記のページ


要するに見えないFrameを生成して貼り付けてあげるという感じでしょうか。

一応試しに、下記のような感じで書いてみたら、ダウンロードができた。

Button btnNewButton = new Button("ダウンロード");
     btnNewButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent event) {
          //ここには、実際はサーブレットのURLなどを書く
          String fileDownloadURL = "http://hostname/mylog.log"; 
          Frame fileDownloadFrame = new Frame(fileDownloadURL); 
          fileDownloadFrame.setSize("0px", "0px"); 
          fileDownloadFrame.setVisible(false); 
          panel.add(fileDownloadFrame); 
      }
     });


GWTのCellTableを使ってみる

GWTのCellTableを使ってみる。
一覧表形式で表示したいときに便利なコンポーネントかも。

サンプルはこんな感じらしい。

http://gwt.google.com/samples/Showcase/Showcase.html#!CwCellTable

GWTDesignerを使って作る場合には、下記の手順で。

1.CellTableを任意の位置に貼り付ける
2.CellWidgetからTextCulumnを選択し1、のTableに貼り付ける
3.あとは、プロパティを適当にいじって


で、表に入れるときには下記のような感じで書く。


//resultはデータのリスト



cellTable.setRowCount(result.size(), true);
cellTable.setRowData(0, result);

また、メモだけど読み取り中の状態にする場合には、
下記のような感じ

cellTable.setRowCount(0,false); // 処理中みたいになる

//サーバ呼び出しの処理を書いて

cellTable.setRowData(0, result);//処理中解除の状態


2011年2月17日木曜日

GWTのUiBinderを試してみる

DialogBoxのJavaDocを見ているとUiBinderのサンプルが載っていた。




調べてみるとUiBinderとは、xmlファイルにUIの情報などが書かれている。
つまり、Javaソースにコンポーネントの位置情報などを書かなくてすむ
ということなんでしょう。

Delphiで言えばdfm的な役割をするものだと思う。

JavaDocを読んだだけでは使い方がよくわからなかったので、
使い方をメモっておく。

まず、新規作成方法

右クリックメニュよりNew→UiBinder


そこで自動生成されたui.xmlに下記のサンプルを貼り付けてみる。


<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
 xmlns:g="urn:import:com.google.gwt.user.client.ui">
 <ui:style>
  .important {
   font-weight: bold;
  }
 </ui:style>
 <g:DialogBox autoHide="true" modal="true">
   <g:caption><b>Caption text</b></g:caption>
   <g:HTMLPanel>
     Body text
     <g:Button ui:field='cancelButton'>Cancel</g:Button>
     <g:Button ui:field='okButton'>Okay</g:Button>
   </g:HTMLPanel>
 </g:DialogBox>

ソースは下記のような感じ。

ポイントは、uiBinder.createAndBindUi(this)という部分で
上記のxmlファイルからフォームオブジェクトを生成する部分。

import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;

public class MyBinderDialog extends Composite  {

 private DialogBox dlg;
 private static MyBinderDialogUiBinder uiBinder = GWT
   .create(MyBinderDialogUiBinder.class);

 interface MyBinderDialogUiBinder extends UiBinder<DialogBox, MyBinderDialog> {
 }

 public MyBinderDialog() {
  dlg=(uiBinder.createAndBindUi(this));
 }
 
 public DialogBox getDialogBox(){
  return dlg;
 }



}

呼び出し側はこんな感じ。

MyBinderDialog db = new MyBinderDialog();
    DialogBox dbox=db.getDialogBox();
    dbox.show();

2011年1月7日金曜日

JavaでThreadLocalを使ってみる

マルチスレッドプログラムにおいて、スレッド毎にpublic staticな変数を作りたい場合
というのがたまにあります。

そんなときに使うのがThreadLocalというクラス。

これを利用すると、スレッド単位でグローバルな変数と言うのを定義できます。

下記がサンプルコード。
スレッド毎に、KeyがIntegerでValueがStringのHashMapを返ししている
様を確認できるサンプルプログラムです。

=====================================

import java.util.HashMap;
import java.util.Map;


public class ThreadLocalTest {
  private static class ThreadHashMap{

      private static ThreadLocal<HashMap<Integer,String>> tl = new ThreadLocal<HashMap<Integer,String>>() {
          protected synchronized HashMap<Integer,String> initialValue() {
              return new HashMap<Integer,String>();
          }
      };

      public static HashMap<Integer,String> get() {
          return tl.get();
      }
  }
  private static class TestThread extends Thread{
   public void run() {
    try {
     for(int i=0;i<5;i++){
      Map<Integer,String> map=ThreadHashMap.get();
      map.put(i, getName());
      sleep(5);
     }
     System.out.println(getName()+":"+ThreadHashMap.get());;
    } catch (Exception e) {
     e.printStackTrace();
    }
   }   
  }
  public static void main(String[] args) throws InterruptedException{
   Thread th=new TestThread();
   Thread th2=new TestThread();
   th.start();
   th2.start();
   
   while(Thread.activeCount()!=1){
    System.out.println("WAIT"+Thread.activeCount());
    Thread.sleep(100);
   }
   System.out.println("END!!!");
  } 
}
 

2010年12月21日火曜日

JavaでDOSコマンドを実行しその結果を表示する

WindowsのDOSコマンドをJavaプログラム内で実行し、その結果を
Javaの内部で取得する方法。

下記のサンプルプログラムでは、netstatコマンドを実行してそれを
表示するサンプル。

import java.io.IOException;
import java.io.InputStream;


public class CommandExecAndSysOutSample {

 public static void main(String[] args) throws IOException, InterruptedException {
  String[] s = {"cmd.exe", "/c", "netstat"};
  Process process = Runtime.getRuntime().exec(s);
  InputStream is = process.getInputStream();
  int size=0;
  byte[] b = new byte[1024];
  while ((size=is.read(b))>0){
   String ss = new String(b,0,size,"MS932");
//   System.out.println(size);
   System.out.print(ss);
   Thread.sleep(100);
  }
  System.out.println("-----------END");
 }

}